繁体   English   中英

为什么我在输出后得到一些随机值?

[英]Why am I getting some random values after the output?

#include <stdio.h>
int main()
{
    int k;
    scanf("%d",&k);
    for(int i=0;i<k;i++)
    {
        char num[10];
        scanf("%s",&num);
        int x = num[0]-'0';
        int sum;
        int y;
        for(int i=0;i<10;i++)
        {
            if(num[i]=='\0')
            {
                y = num[i-1]-'0';
                sum = x+y;
                printf("%d\n",sum);
            }
        }   
    }
    return 0;
}

该程序是获取给定数字的第一位和最后一位的总和。 输出后我得到了一些随机值。 谁能解释一下这个以及如何消除它? 在此处输入图像描述

您有一个内部循环,用于查找数组中的终止空字节。 你找到了它,但随后你继续遍历数组以寻找更多的空字节。 如果你碰巧找到一个,它会接受前面的字节并将其视为最后一位。

您可以通过在找到空终止符时跳出循环来解决此问题:

    for(int i=0;i<10;i++)
    {
        if(num[i]=='\0')
        {
            y = num[i-1]-'0';
            sum = x+y;
            printf("%d\n",sum);
            break;
        }
    }   

或者简单地使用strlen来查找字符串的末尾。

    y = num[strlen(num)-1]-'0';
    sum = x+y;
    printf("%d\n",sum);

该代码也不处理读取太多字符,这可能会溢出缓冲区,或者读取空字符串,在这种情况下num[strlen(num)-1]不在数组的开头。 您可以通过在scanf格式中放置一个字段宽度来解决前者问题,而后者则通过显式检查来解决:

    char num[10];
    scanf("%9s",num);
    int sum;
    if (num[0] == 0) {
        sum = 0;
    } else {
        int x = num[0]-'0';
        int y = num[strlen(num)-1]-'0';
        sum = x + y;
    }
    printf("%d\n",sum);

问题是一旦打印总和,您就不会停止内部循环。 您继续使用数组num中超出字符串终止符的不确定元素。 这会导致未定义的行为

您可以通过不使用内部循环(通过使用索引0strlen(num) - 1 ),或者在打印总和后使用break跳出循环来解决它。

暂无
暂无

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

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