我编写了一个程序来接收用户输入,并将其打印到屏幕上。
示例输入是abc 12 34
。
示例输出为abc 12 34
,但12
和34
应作为整数输入。
对于样例输入,我的程序总是输出为abc 122 344
。我已经研究了很长一段时间了,但我还是想不通。能帮我检查一下代码吗?谢谢。
我的gcc版本是4.1.2。
#include<stdio.h>
#include<stdlib.h>
int main()
{
char c;
char *str = NULL;
str = (char *)malloc(20*sizeof(char)); /*just sample code, not robust*/
memset(str,'\0',20*sizeof(char));
if(str == NULL)
{
fprintf(stderr,"Error: failed to allocate memory.\n"); fflush(stderr);
return 0;
}
/*store user input*/
int index = 0;
while((c=getchar()) != '\n')
{
*(str+index) = c;
index++;
}
int digit = 0;
for(index = 0; *(str+index)>0; index++)
{
if((*(str+index)>='a') &&( *(str+index)<='z'))
{
fprintf(stdout,"%c",*(str+index)); fflush(stdout);
}
else if((*(str+index)>='0') &&( *(str+index)<='9'))
{
/*handling the case that a number with more than one digit*/
if(*(str+index+1)>='0' && *(str+index+1)<='9')
{
digit=10*(digit+atoi(str+index));
}
else
{
digit += atoi(str+index);
fprintf(stdout,"%d",digit); fflush(stdout);
digit = 0;
}
}
else
{
fprintf(stdout,"%c",*(str+index)); fflush(stdout);
}
}
printf("\n");
free(str);
return 0;
}
发布于 2012-10-26 23:40:37
您不应该使用atoi
:它将字符串转换为int
,而不是单个char
。
下面是发生的事情:当您看到一个两位数,比如34
,第一次迭代将两位数都传递给atoi
,获取34
,然后将其乘以10,生成340
。下面的迭代获取4
,并愉快地将其添加到340
中,作为344
的累积结果。
如果要将表示数字的单个char
转换为int
,请使用减法:
digit = *str - '0';
此外,您用于处理多位数的代码是非正统的,这使得它很难理解。当您看到下一个字符是一个数字时,不应该将当前值乘以十,而应该在看到一个数字时将前一个值乘以十。这甚至适用于第一个数字,当先前的值为0
时,因为十乘以零仍然是零。
您应该删除if(((*str+index+1)>='0') && (*str+index+1)<='9')
及其then
分支,并修改其else
分支,如下所示:
digit = 10*digit + *(str+index) - '0';
if (((*str+index+1)<'0') || (*str+index+1)>'9') {
fprintf(stdout,"%d",digit); fflush(stdout);
digit = 0;
}
发布于 2012-10-26 23:37:53
那么直接使用sscanf
如何呢?如下所示:
sscanf(str, "%s %d %d", str1, &num1, &num2);
如果由于某些原因不能使用sscanf
,那么至少应该使用isalpha()
和isdigit()
分别检查字符和数字。
因此,不要使用这个:
if((*(str+index)>='a') &&( *(str+index)<='z')) {
.....
}
使用以下命令:
if (isalpha(*str+index)) {
.....
}
https://stackoverflow.com/questions/13089953
复制相似问题