C,VB语言问题~~~
比如:scanf("%d",aa);获取数字,
那么字符为什么要加fflush(stdin)呢?
字符串怎么取法?
还有多少种办法,牛牛内来介绍一下。
比如说我现在要用do while来做个菜单,那么WHILE里的参数如果用字符该怎么取得输入呢??
[ 本帖最后由 8戒 于 28-8-2010 22:55 编辑 ] 不懂Windows上C的人路过帮顶:ppb_86 iostream<<也是可以的,但是我从来不用。
scanf("%s",str); 标准C里面有 iostream<< ?
这都进化得和C++差不多了么... 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里的参数如果用字符该怎么取 ... fflush(stdin)很少用,参见这里:
http://zhidao.baidu.com/question/19308630
这种用法很少见,因为通过stdin输入时,即当采用getchar,gets,scanf等函数读入时,系统会自动在每个操作之后清理缓冲区,所以再使用fflush(stdin)没什么意义。
倒是fflush(stdout)更常用一些。
我一般就用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
所上所说我全部赞同 原帖由 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:(
回复 #7 key 的帖子
read()啊,我真是几乎没用过,除了用于串口编程或控制一些硬件数据读取我见过之外,其它地方我也很少见到用(我所接触的编程范围):lol :lol不过fread我倒是经常用,fgets能不用还是尽量别用,一不小心就coredump了:P :P 原帖由 ubuntuhk 于 10-8-2010 14:16 发表 http://www.freeoz.org/ibbs/images/common/back.gif
read()啊,我真是几乎没用过,除了用于串口编程或控制一些硬件数据读取我见过之外,其它地方我也很少见到用(我所接触的编程范围):lol :lol
不过fread我倒是经常用,fgets能不用还是尽量别用,一不小心就coredum ... 特别是在ubuntu下会这样;P read/write open/close 比 fread/fwrite fopen/fclose更底层,基本就是system call的简单封装了,没有buffer, 适合key同学这样的buffer控;P
没有特殊原因,还是用f系列的函数更简单一些,不过read/write代码更通用,不必仅限于文件了,所有IO都包含了。 原帖由 ritz 于 9-8-2010 21:43 发表 http://freeoz.org/ibbs/images/common/back.gif
标准C里面有 iostream
I was wrong, I read it c++. #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;
} 这段程序有问题,无法通过编译,请帮我看一下是什么问题?
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 编辑 ]
回复 #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");
别的没仔细看。 int86(0x14,?,?); //这句也不对,调用中断? 问号是什么。
------------------
int ReadPort(port)
int port;
---------------
这样的函数声明方式是很原始的K&R C风格,C语言初期的风格,应该
int ReadPort(int port) 这样,你是看的那本古董C编程的书? 呵呵,网上找来的代码,想研究一下,结果发现都是没办法用的。 原帖由 8戒 于 24-8-2010 14:29 发表 http://www.freeoz.org/ibbs/images/common/back.gif
呵呵,网上找来的代码,想研究一下,结果发现都是没办法用的。
不能这么烟酒啊,这得猴年马月才能撞出眉目啊。拿一本小书看看先,C语言的语法,结构都很简单的 回老丐,已经看过了。非常简单,但是弄到程序上就觉得好难懂,呵呵~~。我们老师昨天还说我学得快,一点就通,说下次要给我更难的题目才行,可是自己学怎么就这么难呢?
我的目标不高,要能写通讯(RS232,OPC),要能把数据按自己的要求写进文件或弄进数据库。
[ 本帖最后由 8戒 于 24-8-2010 14:46 编辑 ] 原帖由 8戒 于 24-8-2010 14:44 发表 http://www.freeoz.org/ibbs/images/common/back.gif
回老丐,已经看过了。非常简单,但是弄到程序上就觉得好难懂,呵呵~~。我们老师昨天还说我学得快,一点就通,说下次要给我更难的题目才行,可是自己学怎么就这么难呢?
我的目标不高,要能写通讯(RS232,OPC), ... 说明学得不扎实
字符串“”,字符''你都搞错了。
还有C语言一定要一开始就弄明白指针是怎么回事
,内存的分配和释放,堆内存和栈内存。
不过一点基础都没有能学到这么多,也的确很快了,而且2孩子的爸爸了,不容易,不容易。 问一下 malloc这个怎么用法?我怎么都没法,在网上的例子在自己机器上都没有成功过,是不是格式有问题呢? 原帖由 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 编辑 ] 原帖由 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 原帖由 四香油饼 于 24-8-2010 21:59 发表 http://www.freeoz.org/ibbs/images/common/back.gif
最后那个肯定不行,指针的初始化里面用了还没定义好的指针,相当于要让鸡蛋孵出来的鸡去孵自己这个蛋。:lol
油饼没学好,人家8戒是对的;P 谢谢油饼,这个我现在明白了。 原帖由 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) ); 原帖由 coredump 于 24-8-2010 23:21 发表 http://www.freeoz.org/ibbs/images/common/back.gif
油饼没学好,人家8戒是对的;P
欧。好吧。赋值是在定义之后才执行的。
不过8戒看得这是什么书啊? 现实中有人这么写程序么? ;P ;P ;P ;P ;P ;P ;P 我也就是看点入门的东西,就想能实现串口及OPC通讯就差不多了,最多再弄个DB连接。不过好像用VB来实现会更简单一点。我现在已经能看懂WINCC的C函数了,这一点对我来说用途很大:loveliness:
接下来就学VB和DB了。
[ 本帖最后由 8戒 于 25-8-2010 00:03 编辑 ]
页:
[1]
2