我制作了一个程序,将输入字符串的数字转换为像atoi
这样的整数,但是输出错误。
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<string.h>
void main(void)
{
static int sum;
int i,x,y,z;
char string[10];
printf("Enter a string:\n");
gets(string);
x=strlen(string);
for(i=0; ;i++)
{
if(string[i]=='\0')
{
break;
}
y=pow(10,i);
z=string[x-i+1]*y;
sum+=z;
}
printf("%d",sum);
getch();
}
答案 0 :(得分:5)
您的字符串不包含int
值0, 1, 2, ... 9
。
它们包含char
值'0', '1', '2', ... '9'
。编码在例如ASCII,'0' == 48
。
您需要将char
转换为int
;一种方法是减去'0'
,例如:
z = (string[x-i+1] - '0') * y;
'0'
和48
进行减法!通过使用Horner方案,不使用pow
也可以做得更好。
这是一个例子(这里^
表示取幂而不是bitwise-xor):
8675309 = 8*10^6 + 6*10^5 + 7*10^4 + 5*10^3 + 3*10^2 + 0*10^1 + 9*10^0
= (((((8*10 + 6)*10 + 7)*10 + 5)*10 + 3)*10 + 0)*10 + 9
起初看起来可能很复杂,但事实并非如此。您基本上从左到右读取数字,然后在添加下一个数字之前将结果乘以10,直到将其加倍。
以表格形式:
step result digit result*10+digit
1 init=0 8 8
2 8 6 86
3 86 7 867
4 867 5 8675
5 8675 3 86753
6 86753 0 867530
7 867530 9 8675309=final
我会让你自己实现这个简单的算法,因为这是作业。
答案 1 :(得分:5)
确定。以下是对代码的快速回顾。嵌入评论。
#include<stdio.h>
在#include
和<stdio.h>
之间留出空格。
#include<conio.h>
这是您不需要的非标准Windows专用标头。不要包括这个。
#include<math.h>
#include<string.h>
在包含标题时再次使用空格。
void main(void)
虽然这是合法的,但更常见的是将签名int main(int argc, char* argv[])
作为主要功能的签名。我建议你使用那个签名。
{
static int sum;
你为什么要这个静态?您是否计划重复调用main并将sum
的先前结果从main调用到另一个?如果没有,那就不要让它静止。
int i,x,y,z;
char string[10];
考虑为字符串分配更多空间。十个字符很小。还可以考虑创建一个变量来表示字符串的大小,而不是使用幻数,因为您可能需要在多个位置引用缓冲区大小。
printf("Enter a string:\n");
gets(string);
没有。不要那样做! 函数获取是一个主要的安全漏洞!。它使您的程序容易受到缓冲区溢出攻击。而是使用fgets,并指定要填充的缓冲区的大小,以便它不会溢出缓冲区。你永远不应该使用普通的。
x=strlen(string);
考虑为x选择更具描述性的名称。也许是len
。创建标识符长于单个字母的变量是完全正确的(也是好的)。
for(i=0; ;i++)
{
if(string[i]=='\0')
{
break;
}
考虑将终止条件放在for循环中; for(i = 0; string[i]!='\0'; i++)
。
y=pow(10,i);
z=string[x-i+1]*y;
提示:除了使用pow之外,还有一种更聪明的方法。
sum+=z;
}
printf("%d",sum);
确定。以上情况很好,但您可能想使用“%d \ n”。
getch();
你真的不应该在所有系统上都这样做。相反,做:
#ifdef _WIN32
system("pause");
#endif
如果可能的话,我会建议你避免那种奇怪的暂停行为。假设您的教授使用自动脚本来验证程序的输出。在程序中放置任何类型的暂停(即使在Windows上)都会破坏这样的脚本。如果您不希望终端窗口在Windows上消失,则应从命令提示符调用您的程序。
}
如果您要按照我的建议将签名更改为返回int的内容,那么您可能希望在函数结束之前添加语句return 0;
。
答案 2 :(得分:2)
它应该是:
z=(string[x-(i+1)]-'0')*y;