8戒 发表于 9-8-2010 20:03:01

C,VB语言问题~~~

比如:

scanf("%d",aa);获取数字,
那么字符为什么要加fflush(stdin)呢?
字符串怎么取法?
还有多少种办法,牛牛内来介绍一下。

比如说我现在要用do while来做个菜单,那么WHILE里的参数如果用字符该怎么取得输入呢??

[ 本帖最后由 8戒 于 28-8-2010 22:55 编辑 ]

dark008 发表于 9-8-2010 21:23:13

不懂Windows上C的人路过帮顶:ppb_86

procoder 发表于 9-8-2010 21:27:34

iostream<<也是可以的,但是我从来不用。
scanf("%s",str);

ritz 发表于 9-8-2010 21:43:09

标准C里面有 iostream<< ?
这都进化得和C++差不多了么...

key 发表于 9-8-2010 22:11:40

scanf()
getc()
fread()
read()
gets()
fgets()
fgetc()
getchar()

随便想了一下写的,没有什么顺序。


原帖由 8戒 于 9-8-2010 20:03 发表 http://www.freeoz.org/ibbs/images/common/back.gif
比如:

scanf("%d",aa);获取数字,
那么字符为什么要加fflush(stdin)呢?
字符串怎么取法?
还有多少种办法,牛牛内来介绍一下。

比如说我现在要用do while来做个菜单,那么WHILE里的参数如果用字符该怎么取 ...

ubuntuhk 发表于 9-8-2010 22:15:20

fflush(stdin)很少用,参见这里:
http://zhidao.baidu.com/question/19308630

这种用法很少见,因为通过stdin输入时,即当采用getchar,gets,scanf等函数读入时,系统会自动在每个操作之后清理缓冲区,所以再使用fflush(stdin)没什么意义。

倒是fflush(stdout)更常用一些。

key 发表于 9-8-2010 22:25:36

我一般就用fgets()和read(),前者用于buffered input,后者用于non-buffered input,
一般来说,后者用得多一些,buffer的控制还是信自己多一点。

原帖由 ubuntuhk 于 9-8-2010 22:15 发表 http://www.freeoz.org/ibbs/images/common/back.gif
fflush(stdin)很少用,参见这里:
http://zhidao.baidu.com/question/19308630

kaile 发表于 9-8-2010 22:53:10

所上所说我全部赞同

coredump 发表于 10-8-2010 10:16:23

原帖由 key 于 9-8-2010 22:11 发表 http://www.freeoz.org/ibbs/images/common/back.gif
scanf()
getc()
fread()
read()
gets()
fgets()
fgetc()
getchar()

随便想了一下写的,没有什么顺序。


gets is evil:(

ubuntuhk 发表于 10-8-2010 14:16:15

回复 #7 key 的帖子

read()啊,我真是几乎没用过,除了用于串口编程或控制一些硬件数据读取我见过之外,其它地方我也很少见到用(我所接触的编程范围):lol :lol

不过fread我倒是经常用,fgets能不用还是尽量别用,一不小心就coredump了:P :P

coredump 发表于 10-8-2010 14:18:00

原帖由 ubuntuhk 于 10-8-2010 14:16 发表 http://www.freeoz.org/ibbs/images/common/back.gif
read()啊,我真是几乎没用过,除了用于串口编程或控制一些硬件数据读取我见过之外,其它地方我也很少见到用(我所接触的编程范围):lol :lol

不过fread我倒是经常用,fgets能不用还是尽量别用,一不小心就coredum ... 特别是在ubuntu下会这样;P

coredump 发表于 10-8-2010 14:23:51

read/write open/close 比 fread/fwrite fopen/fclose更底层,基本就是system call的简单封装了,没有buffer, 适合key同学这样的buffer控;P

没有特殊原因,还是用f系列的函数更简单一些,不过read/write代码更通用,不必仅限于文件了,所有IO都包含了。

procoder 发表于 10-8-2010 18:17:14

原帖由 ritz 于 9-8-2010 21:43 发表 http://freeoz.org/ibbs/images/common/back.gif
标准C里面有 iostream
I was wrong, I read it c++.

8戒 发表于 23-8-2010 22:17:02

#include "dos.h"
#include "stdlib.h"
#include "stdio.h"
#define PORT 0
void SendFile(char *fname); /* 发送文件*/
void Send(int s); /*发送一个字节*/
void SendFileName(char *fname); /*发送文件名*/
void ReceiveFile(); /*接收文件*/
void GetFileName(char *f); /*接收文件名*/
void InitPort(int port,unsigned char para); /*初始化端口*/
void SendPort(int port,char c); /*端口发送*/
int ReadPort(int port); /*读端口字节*/
int CheckState(int port); /*检查端口状态*/
int Receive(int port,int *G); /*接收一个字节*/
main(int argc,char *argv[])
{
         if(argc<2)
         {
                printf("Please input R(receive) or S(sent) parametre:");
                exit(1);
         }
         InitPort(PORT,231);
         if(*argv==''''S'''') /*检查选择的有效性*/
                  SendFile(argv);
         else if(*argv==''''R'''')
                  ReceiveFile();
         else
         {
                  printf("Error parament.Please input again.");
                  exit(1);
         }
}

void SendFile(char *fname)
{
      FILE *fp;
      int ch,s;
      if((fp=fopen(fname,"rb"))==NULL)
      {
             printf("Can''''t open the file.\n");
             exit(1);
      }
      SendFileName(fname);
      do
      {
            ch=(int)getc(fp);
            if(ferror(fp))
            {
            printf("Error reading file.\n");
            break;
            }
      s=ch%16; /*取文件中一个字节的低4位*/
      Send(s);
      s=ch/16; /*取文件中一个字节的高4位*/
      Send(s);
      }
      while(!feof(fp));
      s=46; /*发送文件结束信息*/
      Send(s);
      Send(s);
      fclose(fp);
}
      
void Send(s)
int s;
{
    int G;
    SendPort(PORT,s);
    G=ReadPort(PORT); /*等待握手信号*/
    if(s!=G)
            s=s+16;
    do
    {
         SendPort(PORT,s);
         G=ReadPort(PORT);/*等待握手信号*/
    }
    while(s!=G);
}

void SendFileName(fname)
char *fname;
{
   int s,ch;
   printf("Now transmit the file.Please wait...");
   while(*fname)
   {
         ch=(int)fname++;
         s=ch%16; /*取文件名中一个字节的低4位*/
         Send(s);
         s=ch/16;
         Send(s); /*取文件名中一个字节的低4位*/
   }
   s=32; /*发送文件名结束标志*/
   Send(s);
   Send(s);
}

void ReceiveFile()
{
   FILE *fp;
   char ch;
   int G1,G2,G3;
   char fname;
   GetFileName(fname);
   printf("Receiving file %s.\n",fname);
   remove(fname);
   if((fp=fopen(fname,"wb"))==NULL)
   {
            printf("Can''''t open output file.\n");
            exit(1);
   }
/*循环为检测每次接受的数据是否为新数据,如果不是,*/
/*则用此次接收的数据覆盖上次接收的数据*/
   G1=ReadPort(PORT);
   G2=Receive(PORT,&G1);
   do
   {
            G3=Receive(PORT,&G2);
            ch=(char)(G1%16+G2*16);/*恢复分开的数据,组合高4位和低4位*/
            putc(ch,fp);
            if(ferror(fp))
            {
                  printf("\nError writing file.");
                  exit(1);
            }
            G2=Receive(PORT,&G3);
            G1=G3;
   }
            while(G1/16!=48);
            printf("\nTransmit finished.");
            fclose(fp);
}

int Receive(port,G)
int port,*G;
{
         int GM;
         SendPort(port,*G);
         GM=ReadPort(port);
         if(GM/16==0)
         return GM;
         else if(GM/16==1)
         {
                   do
                   {
                   *G=GM;
                   SendPort(port,GM);
                   GM=ReadPort(port);
                   }
                   while(GM/16==1);
         }
         return GM;
}
   
void GetFileName(char *f)
{
                int G1,G2,G3;
                char ch;
                G1=ReadPort(PORT);
                G2=ReadPort(PORT);
                do
                {
                                G3=Receive(PORT,&G3);
                                ch=(char)(G1%16+G2/16);
                                *f=ch;
                                *f++;
                                G2=Receive(PORT,&G3);
                                G1=G3;
                }while(G1/16!=32);
                printf("File name transmit finished.\n");
}


void InitPort(port,para)
int port;
unsigned char para;
{
                union REGS reg;
                reg.x.dx=port;
                reg.h.ah=0;
                reg.h.al=para;
                int86(0x14,?,?);
}


void SendPort(port,c)
int port;
char c;
{
                union REGS reg;
                reg.x.dx=port;
                reg.h.al=c;
                reg.h.ah=1;
                int86(0x14,?,?);
                if(reg.h.ah&128)
                        {
                                        printf("\nSend mistakes!");
                                        exit(1);
                        }
}


int ReadPort(port)
int port;
{
                union REGS reg;
                while(!(CheckState(port)&256))
                {
                                if(kbhit())
                                                        {                  /*如端口长期无数据可人为终止等待*/
                                                                                printf("Press any key to exit.");
                                                                                getch();
                                                                                exit(1);
                                                        }
                }
reg.x.dx=port;
reg.h.ah=2;
int86(0x14,?,?);
if(reg.h.ah&128)
                {
                                printf("\nRead mistake!");
                                exit(1);
                }
return reg.h.al;
}

int CheckState(port)
int port;
{
                union REGS reg;
                reg.x.dx=port;
                reg.h.ah=3;
                int86(0x14,?,?);
                return reg.x.ax;
}

8戒 发表于 23-8-2010 22:19:19

这段程序有问题,无法通过编译,请帮我看一下是什么问题?
23:25 D:\My documents\aaa.c empty character constant
D:\My documents\aaa.c In function `main':
23 D:\My documents\aaa.c syntax error before '\x0'

[ 本帖最后由 8戒 于 23-8-2010 22:20 编辑 ]

ubuntuhk 发表于 24-8-2010 03:45:45

回复 #15 8戒 的帖子

我看了一下,貌似这里有两行语法有错:

         if(*argv==''''S'''') /*检查选择的有效性*/
                  SendFile(argv);
         else if(*argv==''''R'''')


改成这样试试:


         if(argv=='S') /*检查选择的有效性*/
                  SendFile(argv);
         else if(argv=='R')


还有这行:

   printf("Can''''t open the file.\n");


改成这样试试:

   printf("Can\'t open the file.\n");


别的没仔细看。

coredump 发表于 24-8-2010 13:23:28

int86(0x14,?,?);   //这句也不对,调用中断? 问号是什么。
------------------
int ReadPort(port)
int port;
---------------
这样的函数声明方式是很原始的K&R C风格,C语言初期的风格,应该
int ReadPort(int port) 这样,你是看的那本古董C编程的书?

8戒 发表于 24-8-2010 14:29:52

呵呵,网上找来的代码,想研究一下,结果发现都是没办法用的。

coredump 发表于 24-8-2010 14:33:42

原帖由 8戒 于 24-8-2010 14:29 发表 http://www.freeoz.org/ibbs/images/common/back.gif
呵呵,网上找来的代码,想研究一下,结果发现都是没办法用的。
不能这么烟酒啊,这得猴年马月才能撞出眉目啊。拿一本小书看看先,C语言的语法,结构都很简单的

8戒 发表于 24-8-2010 14:44:23

回老丐,已经看过了。非常简单,但是弄到程序上就觉得好难懂,呵呵~~。我们老师昨天还说我学得快,一点就通,说下次要给我更难的题目才行,可是自己学怎么就这么难呢?

我的目标不高,要能写通讯(RS232,OPC),要能把数据按自己的要求写进文件或弄进数据库。

[ 本帖最后由 8戒 于 24-8-2010 14:46 编辑 ]

coredump 发表于 24-8-2010 15:44:01

原帖由 8戒 于 24-8-2010 14:44 发表 http://www.freeoz.org/ibbs/images/common/back.gif
回老丐,已经看过了。非常简单,但是弄到程序上就觉得好难懂,呵呵~~。我们老师昨天还说我学得快,一点就通,说下次要给我更难的题目才行,可是自己学怎么就这么难呢?

我的目标不高,要能写通讯(RS232,OPC), ... 说明学得不扎实
字符串“”,字符''你都搞错了。
还有C语言一定要一开始就弄明白指针是怎么回事
,内存的分配和释放,堆内存和栈内存。

不过一点基础都没有能学到这么多,也的确很快了,而且2孩子的爸爸了,不容易,不容易。

8戒 发表于 24-8-2010 21:29:22

问一下 malloc这个怎么用法?我怎么都没法,在网上的例子在自己机器上都没有成功过,是不是格式有问题呢?

8戒 发表于 24-8-2010 21:33:16

原帖由 coredump 于 24-8-2010 15:44 发表 http://www.freeoz.org/ibbs/images/common/back.gif
说明学得不扎实
字符串“”,字符''你都搞错了。
还有C语言一定要一开始就弄明白指针是怎么回事
,内存的分配和释放,堆内存和栈内存。

不过一点基础都没有能学到这么多,也的确很快了,而且2孩子的爸爸了, ...

指针好像我搞明白了,*是定义和操作符,&是用来取地址的。比如说
int i,*p;
i=1;
p=&i;
这里的指针指向是是i的地址。要取p的值用*p
我说的对不对?


在网上看到说指针必须先定义,并初始化,介绍用这个命令:
int *ptr = malloc( sizeof(*ptr) );
可是我怎么用都不行。

[ 本帖最后由 8戒 于 24-8-2010 21:34 编辑 ]

四香油饼 发表于 24-8-2010 21:59:45

原帖由 8戒 于 24-8-2010 21:33 发表 http://www.freeoz.org/ibbs/images/common/back.gif


指针好像我搞明白了,*是定义和操作符,&是用来取地址的。比如说
int i,*p;
i=1;
p=&i;
这里的指针指向是是i的地址。要取p的值用*p
我说的对不对?


在网上看到说指针必须先定义,并初始化,介绍用这个 ...

最后那个肯定不行,指针的初始化里面用了还没定义好的指针,相当于要让鸡蛋孵出来的鸡去孵自己这个蛋。:lol

coredump 发表于 24-8-2010 23:21:22

原帖由 四香油饼 于 24-8-2010 21:59 发表 http://www.freeoz.org/ibbs/images/common/back.gif


最后那个肯定不行,指针的初始化里面用了还没定义好的指针,相当于要让鸡蛋孵出来的鸡去孵自己这个蛋。:lol
油饼没学好,人家8戒是对的;P

8戒 发表于 24-8-2010 23:32:06

谢谢油饼,这个我现在明白了。

coredump 发表于 24-8-2010 23:46:03

原帖由 8戒 于 24-8-2010 21:33 发表 http://www.freeoz.org/ibbs/images/common/back.gif

int *ptr = malloc( sizeof(*ptr) ); ... int *ptr = malloc( sizeof(int) );

四香油饼 发表于 24-8-2010 23:55:15

原帖由 coredump 于 24-8-2010 23:21 发表 http://www.freeoz.org/ibbs/images/common/back.gif

油饼没学好,人家8戒是对的;P


欧。好吧。赋值是在定义之后才执行的。

不过8戒看得这是什么书啊? 现实中有人这么写程序么?

8戒 发表于 24-8-2010 23:57:59

;P ;P ;P ;P ;P ;P ;P

8戒 发表于 25-8-2010 00:00:36

我也就是看点入门的东西,就想能实现串口及OPC通讯就差不多了,最多再弄个DB连接。不过好像用VB来实现会更简单一点。我现在已经能看懂WINCC的C函数了,这一点对我来说用途很大:loveliness:
接下来就学VB和DB了。

[ 本帖最后由 8戒 于 25-8-2010 00:03 编辑 ]
页: [1] 2
查看完整版本: C,VB语言问题~~~