创建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; } 

  1. 您正在声明一个char *数组,即一个字符串数组,而不是一个字符串。 你可能想要:

     char number[MAXSIZE]; 
  2. 您的scanf格式字符串是错误的。 如果要读取字符串,则应使用%s%c只读取一个字符。

  3. 您的scanf参数错误 – 传递number本身(或者如果您愿意,则为&number[0] ),而不是&number

  4. 你传递给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; }