我正在尝试创建自己的atoi功能。通过以下我得到的返回值为0.无论我改变函数中的数字变量是我得到的返回值。有关修改代码的任何建议吗?
//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;
}
答案 0 :(得分:8)
您正在声明一个char *
数组,即一个字符串数组,而不是一个字符串。你可能想要:
char number[MAXSIZE];
您的scanf
格式字符串错误。如果要读取字符串,则应使用%s
。 %c
只读取一个字符。
您的scanf
参数错误 - 如果您愿意,可以传递number
(或&number[0]
),而不是&number
。
您传递给atoi_me
的参数错误。请使用number
(或等效&number[0]
),而非*number
进行调用。
将所有这些放在一起,你应该有一个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)
传统上也支持负数(带有前导-
)和可选前导+
的正数,您的实现无法处理。
答案 1 :(得分:1)
正如我所想,问题出在你的电话中。
将您的主要内容更改为。
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
。
答案 2 :(得分:1)
这不是您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;
}
在这里,我使用line
检索到的fgets()
,并解析包含数字的输入部分。前导空格会导致sscanf()
跳过导致数字的空格字符。
答案 3 :(得分:0)
由于number
应该是一个char数组,
char number[MAXSIZE];
,&number
,而是使用number
直接调用您的函数:atoi_me(number);
答案 4 :(得分:0)
一些意见:
int atoi_me(const char *numstring)...
最好使用const类型指针,因为您不打算修改字符串内容。
int main()
{
char number[MAXSIZE]; // array of chars
int num;
printf("Please enter a number:\n");
scanf("%s", number); // enter a string, not a char
num = atoi_me(number); // pointer to char, not pointer to pointer
printf("%d", num);
return 0;
}