字符串到整数

时间:2010-07-11 16:20:22

标签: c

我制作了一个程序,将输入字符串的数字转换为像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();
}

3 个答案:

答案 0 :(得分:5)

您的字符串不包含int0, 1, 2, ... 9

它们包含char'0', '1', '2', ... '9'。编码在例如ASCII,'0' == 48

您需要将char转换为int;一种方法是减去'0',例如:

z = (string[x-i+1] - '0') * y;

相关问题


关于霍纳的计划

通过使用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;