创建atoi功能

时间:2013-04-17 17:56:40

标签: c function atoi

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

5 个答案:

答案 0 :(得分:8)

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

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

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

  4. 您传递给atoi_me的参数错误。请使用number(或等效&number[0]),而非*number进行调用。

  5. 将所有这些放在一起,你应该有一个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;
}