4

我正在尝试创建自己的 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;
}
4

5 回答 5

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

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

  3. 您的scanf参数是错误的 - 传递number自己(或者&number[0]如果您愿意),而不是&number.

  4. 您传递给的参数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)传统上还支持负数(带有前导-)和正数的可选前导+,您的实现无法处理。

于 2013-04-17T18:09:07.110 回答
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()跳过导致数字的空格字符。

于 2013-04-17T18:32:07.540 回答
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.

于 2013-04-17T18:11:09.077 回答
0

由于number应该是一个字符数组,

  • char number[MAXSIZE];您应该将其声明为
  • &number你不应该用number, 直接调用你的函数:atoi_me(number);
于 2013-04-17T18:10:21.740 回答
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;
}
于 2013-04-17T18:13:44.473 回答