我试图创建自己的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;
}
你声明的数组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)
传统上还支持负数(以领先-
和一个可选的领先+
为正数,你的实现还不能处理。
因为我认为,这个问题是在你的电话。
改变你的主来。
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
。
这不是你的问题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()
跳过空格字符导致对位。
一些评论:
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;
}