将基本字符串实现为整数转换器时出错

时间:2014-12-09 21:00:59

标签: c

我正在编写一个基本的C程序,它将输入一个字符串,然后将其转换为整数。我知道标准的atoi()函数,这纯粹是我自己设定的练习。该计划的代码如下:

#include <stdio.h>
#include <string.h>

int main (void) {
    char input[20];
    int counter, temp, magnitude = 0, value = 0;
    scanf("%s", input); //takes user input for string to convert
    for (counter = strlen(input); counter >= 0; counter--) { //from last to first char of input
        temp = input[counter] - '0'; //converts from ASCII to actual value and stores in int
        value += temp * magnitude * 10; //temp to correct magnitude and adds to total
        magnitude++; //increments magnitude counter
    }
    printf("%d\n", value); //prints result
    return 0;
}

我试图从字符串的末尾向后迭代,然后将每个字符转换为ASCII的实际值,然后将其转换为正确的幅度,最后将其添加到最终值。虽然错了,但它给我的价值通常很接近。

例如256给出220和90给出180。

6 个答案:

答案 0 :(得分:0)

strlen给出字符串的总长度。所以你必须使用

counter = strlen(input)-1

在你的for循环中。这是因为C中的数组从0开始,到strlen -1结束。

答案 1 :(得分:0)

counter = strlen(input)

应该是

counter = strlen(input) - 1

所以你正在使用字符串的最后一个有效字符。

答案 2 :(得分:0)

你有两个问题。首先,您还尝试转换终止NUL字节,这没有意义。开始在strlen(input) - 1迭代。

其次,对于您想要取幂的幅度,而不是乘法,即10,100,1000而不是10,20,30。为此,您可以使用pow(),例如:

for (counter = strlen(input) - 1; counter >= 0; counter--) { //from last to first char of input
    temp = input[counter] - '0'; //converts from ASCII to actual value and stores in int
    value += temp * pow(10, magnitude); //temp to correct magnitude and adds to total
    magnitude++; //increments magnitude counter
}

答案 3 :(得分:0)

这里有两个问题。 1)您应该忽略字符串null-terminator,因此从strlen(input)-1开始执行 2)你的计算错了。你不应该乘以量级,而是增加10倍的力量。或者更简单,它本身就是所需的10的力量:

#include <stdio.h>
#include <string.h>

int main (void) {
    char input[20];
    int counter, temp, magnitude = 1, value = 0;
    scanf("%s", input); //takes user input for string to convert
    for (counter = strlen(input)-1; counter >= 0; counter--) { //from last to first char of input
        temp = input[counter] - '0'; //converts from ASCII to actual value and stores in int
        value += temp * magnitude ; //temp to correct magnitude and adds to total
        magnitude*=10; //increments magnitude counter
    }
    printf("%d\n", value); //prints result
    return 0;
}

答案 4 :(得分:0)

虽然您的方法应该有效(在其他答案中提到的问题已得到解决之后,无论如何),采用这种方法可能更简单:

value = 0;
for (char *p = input; *p; ++p)
  value = value * 10 + (*p - '0');

这消除了一些不必要的额外变量,并且可能更有效。将for循环终止条件更改为*p && isdigit(*p)可能没有什么坏处 - 这会终止对看到的第一个非数字字符的转换,这可能是处理无效输入的理想方法...

答案 5 :(得分:0)

here is a complete answer,
that includes good programming paradigm practices
and defensive coding against user input problems
and results in the right answer

#include <stdio.h>  // fgets(), exit(), printf()
#include <stdlib.h> // EXIT_FAILURE, perror()
#include <string.h> // strlen()
#include <ctype.h>  // isdigit()

int main () // <-- do not use void
{
    char input[20] = {'\0'};
    int counter; // index into input array
    int value = 0; // initialize the converted int from string

    if( NULL != fgets(input, sizeof(input), stdin) ) 
    { // fgets failed
        perror( "fgets failed for string input");
        exit( EXIT_FAILURE );
    }

    // implied else, fgets successful

    // note no need to replace trailing '\n' in following code block
    for( counter=0; isdigit(input[counter]); counter++)
    {
        value = value*10 + (input[counter]-'0');
    } // end for


    printf("the converted value from %s is: %d\n", input, value); //prints result
    return 0;
} // end function: main