创建atoifunction
我正在尝试创建自己的atoifunction。 通过以下我得到的返回值为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
称呼它。
把所有这些放在一起,你应该有一个像这样的主程序:
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)
这样的function,这样可以很容易地防止出现这种问题。
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; }
在这里,我使用用fgets()
检索的line
,并解析包含数字的输入部分。 前导空格使sscanf()
跳过导致数字的空格字符。
因为number
应该是一个char数组,
- 你应该把它声明为字
char number[MAXSIZE];
, - 你不应该直接用
&number
调用你的函数:atoi_me(number);
一些评论:
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; }