这个程序的题目:检查两个输入数或字符串是否相等。
其中
numcmp(a,b)
char *a,*b;
{
if(atoi(a)==atoi(b))
return(0);
else
return(1);
}
这是一段数比较函数,那么a,b都应该是数,比方说一个2,一个3,为什么这两个又是指针?那么atoi(a)的意思,
就是把a指针所指的那个数变换,然后进行比较。可是a并没有所指的数呀?
况且这是数的比较,为什么要用atoi函数(字符转数字)?
还有,整个程序运行不能正确运行,估计是
main()
{
int strcmp(),numcmp();
char str1[100],str2[100];
printf("\n Please enter two strings or numbers:");
scanf("%s",str1);
scanf("%s",str2);
printf("\n Please enter 'n' for number compare or enter 'c' for strings compare:");
if(getchar()=='n')
check(str1,str2,numcmp);
else
check(str1,str2,strcmp);
}
这一段的毛病,
printf("\n Please enter 'n' for number compare or enter 'c' for strings compare:");
if(getchar()=='n')
根本就没有机会输入n or c?
请各位大哥挑一下这个程序的毛病?
解决方法:在那个判断语句前面scanf后面插入一个getchar();
太困了,说得比较乱,抱歉
To: disguise
这个问题要先从几个函数讲起
getchar() getche() getch()
这三个函数的返回值都是一个字符,但效果并不同
getchar() 是从输入流读取一个字符
getche() 是从控制台获取一个字符且返回到输出设备,属于 conio.h
getch() 是从控制台获取一个字符但不返回到输出设备,属于 conio.h
下面是几个实例的回显
A. getchar()
Please input a char:y[Enter]
char is 'y'
B. getche()
Please input a char:y
char is 'y'
C. getch()
Please input a char:
char is 'y'
就输入时来说,getchar() 必须等待一个回车符才能开始处理并返回输入字串的第一个字符,而 getche() 和 getch() 则只接收控制台返回的一个字符就处理,这其中是不同的,在此例中,用上 getche() 来替换 getchar() 才是正确的做法,你可以试试。
如果你的 getchar() 放在 scanf() 前面的话将不会出现此类问题,而为什么放在后面会出现问题呢?原因是在 scanf 这个函数
...
char test[100];
scanf("%s", &test);
当我们输入字串 123 后,输入流(stdin)如下
stdin: [1] [2] [3] [\n] (M$)
stdin: [1] [2] [3] [\r] [\n] (Unix)
当 scanf() 运行后,把输入流和 test 字串如下
stdin: \n (M$)
stdin: \r\n (Unix)
test: [1] [2] [3] [\0]
这时你使用了 getchar(),但 getchar() 将先判断输入流中是否存在行结束符(在 M$ 里是 \n,在 Unix 里是 \r\n),如果存在行结束符则返回第一个字符,此时已看出问题所在,这时输入流(stdin)存在行结束符,于是,getchar()返回第一个字符,在 M$ 下,此字符为 \n。
而如果你使用 getche() 或 getch() 却为什么不会发生这个问题呢?呵呵,这个问题你可以查阅一下资料,要是我什么都说了,相反你不会理解得很清楚,提示一下,这和键盘缓冲区,寄存器,堆栈等有关 ^_*
------------------
技术相关的不用找我,我是菜鸟;
空虚的美眉不用找我,我有女友;
无聊的大虾不用找我,我只发呆;
以上皆否的不用找我,我想清静!
[被 xiean 编辑过(日期 08-18-2001)]
if(atoi(a)==atoi(b))
这句里转为整型量的,atoi(char *) 函数用于将字串转为整理量
另外,这段代码写得并不好,很多地方都可以找出问题,照这种代码学语言有时会误解你的思路
------------------
技术相关的不用找我,我是菜鸟;
空虚的美眉不用找我,我有女友;
无聊的大虾不用找我,我只发呆;
以上皆否的不用找我,我想清静!
2,你说的char *a,*b; 实际是这么回事,我觉得这个程序不是你编的,因为你能写出来,应该知道CHAR * A就是用来声明指针的,和是不是函数的变量没有什么关系。
numcmp(a,b)
char *a,*b;
{
if(atoi(a)==atoi(b))
return(0);
else
return(1);
}
其中
char *a,*b;
为什么是指针?是不是函数的变量都是指针?为什么不直接用a,b?
你说的那个关于的问题,在实际中,你的那一段程序的代码已经执行了,只不过你在程序设计中思路不完善,没有错误思路和考虑.
在if(getchar()=='n')
check(str1,str2,numcmp);
else
check(str1,str2,strcmp);
}
这个代码里面,你应该用一个循环来控制,再考虑输入的其它情况,和执行程序的人不按你安排的情况来以后给他的提示,以及回到他操作错误前的那个断点的跳回代码.
不好意思,上次没有来得及给你说清楚,实在是抱歉,我现在学程序设计也少多了,可能说错了.
我的EMAIL:ylb2000@263.net
------------------
我就是我!只有我才能找回我自己!一个男孩子的话——huang的!
[被 huang 编辑过(日期 08-19-2001)]