从多项式中提取能量

时间:2015-04-03 11:12:11

标签: c

int main()
{
    int num,k,p,w;
    char parts[30];
    char power[30];
    scanf("%s",parts);
    int count=strlen(parts);
    for(w=0;w<count;w++){
            if(parts[w]=='^')
                num=w;
        }
        if(isdigit(num)) {
        for(k=num+1 ; k<count ;k++)
            strcat(power,parts[k]);
        }
        else{
        strcpy(power,'1');
        }

        p=atoi(power);
        printf(" the power is : %d\n",p);
}

..谁能告诉我这里有什么问题? 我继续运行代码,但没有任何反应......但它看起来不错

1 个答案:

答案 0 :(得分:0)

问题:

  1. 如果用户输入的内容不包含'^',那么您的代码会显示Undefined Behavior,因为此处未初始化数字

    if(isdigit(num))
    

    如果输入确实包含'^',则if将为真。

  2. 下面:

    strcat(power,parts[k]);
    

    strcat在第一个参数中找到NUL终结符,并从该位置覆盖其第二个参数。但power尚未初始化!所以,这也会调用Undefined Behavior。此外,parts[k]char,但strcat期望其参数均以NUL终止且属于const char* 类型。
    使用

    初始化`power
    char power[30]={0};
    

    并将strcat更改为

    strcat(power,&parts[k]);
    
  3. 这里也出现了同样的问题:

    strcpy(power,'1');
    

    将其更改为

    strcpy(power,"1");
    

    修复它。双引号使const char*类型的字符串文字被\0终止

  4. 下面:

    scanf("%s",parts);
    

    用户可以输入长度超过29个字符的字符串(\0终止符为+1)。这也会导致Undefined Behavior。通过使用

    限制要扫描的字符数来修复它
    scanf("%29s",parts);
    

    完成此操作后,scanf将从标准输入流中扫描最多29个字符(\0终结符+1)。