我正在编写一个基本的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。
答案 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