我正在尝试创建我自己的atoi函数。使用以下代码,我得到的返回值为0。无论我如何改变函数中的number变量,我都会得到返回值。对修改代码有什么建议吗?
//my atoi function
int atoi_me(char *numstring)
{
int number = 0;
while((*numstring >= '0') && (*numstring <= '9'))
{
number = (number * 10) + (*numstring - '0');
numstring++;
}
return number;
}
int main()
{
char *number[MAXSIZE];
int num;
printf("Please enter a number:\n");
scanf("%c", &number);
num = atoi_me(*number);
printf("%d", num);
return 0;
}发布于 2013-04-18 02:09:07
char *数组,也就是一个字符串数组,而不是单个字符串。您可能需要:char numberMAXSIZE;
scanf格式字符串错误。如果你想读取一个字符串,你应该使用%s。%c只读取一个character.
number本身(或者如果你喜欢的话,传递&number[0] ),而不是传递给atoi_me的&number.
*number.
而不是number (或等效的&number[0])调用它
把所有这些放在一起,你应该有一个类似下面这样的main例程:
int main(void)
{
char number[MAXSIZE];
int num;
printf("Please enter a number: ");
scanf("%s", number);
num = atoi_me(number);
printf("%d\n", num);
return 0;
} 编者按:scanf行有一个潜在的缓冲区溢出。您最好使用像fgets(3)这样的函数,它可以很容易地防止这种问题。
传统上,atoi(3)还支持负数(具有前导-)和可选的前导+ (用于正数),但您的实现不会处理这些+。
发布于 2013-04-18 02:11:09
正如我所想的,问题出在你的电话里。
将您的main更改为。
int main()
{
char number[MAXSIZE];
int num;
printf("Please enter a number:\n");
scanf("%s", number);
num = atoi_me(number);
printf("%d", num);
return 0;
}除此之外,使用scanf - http://c-faq.com/stdio/scanfprobs.html不是一个好主意。在这种情况下,您应该使用fgets。
发布于 2013-04-18 02:32:08
这不是atoi_me()函数的问题,而是如何获得输入的问题。您的实现显示了您对scanf()工作原理的理解上的一些弱点。这本身不是问题,犯错毕竟是学习过程的一部分。
通常,先将输入收集到缓冲区中会更安全,因为来自标准输入的scanf()太依赖于程序的用户来精确地键入您期望的输入。在这种情况下,没有太大的危害,因为您只需要一行输入。但是,通常情况下,程序将处理多行输入,当出现错误时,scanf()可能会阻塞。因此,您可以使用类似下面的代码来获取您的输入行:
char line[MAXLINESIZE];
if (fgets(line, MAXLINESIZE, stdin) == 0) {
fprintf(stderr, "no input was provided!\n");
return 0;
}正如在其他地方提到的,%c不是用于您正在收集的输入的错误格式说明符。因为您需要十进制数字,所以*scanf()系列有一个格式说明符,只允许您收集这些字符。
char number[MAXSIZE];
if (sscanf(line, " %[0-9]", number) != 1) {
fprintf(stderr, "no number found in input: %s", line);
return 0;
}在这里,我使用通过fgets()检索到的line,并解析出包含数字的输入部分。前导空格使sscanf()跳过以数字开头的空格字符。
https://stackoverflow.com/questions/16066885
复制相似问题