-->

创建的atoi功能(Creating an atoi function)

2019-08-31 10:23发布

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

Answer 1:

  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)传统上还支持负数(以领先-和一个可选的领先+为正数,你的实现还不能处理。



Answer 2:

因为我认为,这个问题是在你的电话。

改变你的主来。

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



Answer 3:

这不是你的问题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()跳过空格字符导致对位。



Answer 4:

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

  • 你应该把它声明为char number[MAXSIZE];
  • 你不应该打电话给你的功能&number ,但与number直接: atoi_me(number);


Answer 5:

一些评论:

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


文章来源: Creating an atoi function
标签: c function atoi