繁体   English   中英

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

[英]convert the numeric string to integer value

我正在尝试使用以下代码将数字字符串转换为整数值。 输出始终比原始值小一。 我没有弄明白我的代码有什么问题。

#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;

}

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

在表达式b=b+... ,使用变量b而不先对其进行初始化。 非静态局部变量不会被初始化,并且将具有不确定的值。 不进行初始化就使用它们会导致UB。 初始化为零:

int i, b = 0;

用户还会为数组a输入许多字符并超出范围,这也会带来问题。 您也没有检查用户实际上仅输入了数字。

您的代码中几乎没有问题。 为了降低UB的风险:

  1. 如果将char[]视为字符串,则其大小应允许容纳\\0终止字符。
  2. 如果您的代码未初始化非静态局部变量值,则应显式地执行此操作(变量int b )。
  3. 如果您读取字符串,请谨慎对待scanf() 溢出导致UB。 使用字段宽度说明符。
  4. 不要混合数据类型( pow()返回值是double )。
  5. 使您的代码尽可能精简,并尽量减少实际数学运算,尤其是在内部循环中。 您完全不需要pow()

请根据您的代码查看注释:

#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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM