将数字字符串转换为整数值

时间:2016-07-14 09:52:58

标签: c

我试图使用以下代码将数字字符串转换为整数值。输出始终小于原始值。我没有弄错我的代码。

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
int main(){

    char a[6];

    int i,b;

    scanf("%s",a);

    for(i=strlen(a)-1;i>=0;i--){

        a[i]=a[i]-48;

        b=b+a[i]*pow(10,(strlen(a)-i-1));
    }

    printf("%d",b);

    getch();

    return 0;

}

2 个答案:

答案 0 :(得分:3)

问题很可能是未定义的行为,因为您使用了未初始化的变量。

在表达式b=b+...中,您使用变量b而不首先初始化它。非静态局部变量未初始化,并且具有 indeterminate 值。使用它们而不进行初始化会导致UB。将其初始化为零:

int i, b = 0;

用户输入数组a的多个字符并超出范围也会遇到问题。您也没有任何用户实际只输入数字的检查。

答案 1 :(得分:0)

您的代码中存在一些问题。为了降低 UB 的风险:

  1. 如果您将char[]视为字符串,则其大小应允许容纳\0终止字符。
  2. 如果您的代码没有初始化非静态局部变量值,您应该明确地执行它(变量int b)。
  3. 如果您读取字符串,请小心处理scanf()。溢出导致UB。使用字段宽度说明符。
  4. 不要混合数据类型(pow()的回复为double)。
  5. 尽可能少地使用尽可能少的数学代码,特别是在循环内部。你完全不需要pow()
  6. 请根据您的代码查看注释:

    #include <stdio.h>
    #include <string.h>
    
    int main(void)
    {
        char a[7];      // extra byte for '\0'
        int i, l, b = 0;//initialize local variable b
        int ten = 1;
    
        scanf("%6s",a); //should use a field width specifier
    
        l = strlen(a) - 1;
    
        for( i=l ; i>=0 ; i--, ten*=10 )
            b += (a[i]-48)*ten; //do as simple math as practical
    
        printf("%d\n",b);
        return 0;
    }