为什么在输出后会得到一些随机值? #包括 int main() { int k; scanf(“%d”和“&k”); 对于(int i=0;i

为什么在输出后会得到一些随机值? #包括 int main() { int k; scanf(“%d”和“&k”); 对于(int i=0;i,c,random,C,Random,而言,问题在于打印求和后不会停止内部循环。继续并在字符串终止符之外使用数组num中的不确定元素。这会导致未定义的行为 您可以通过不使用内部循环(通过使用索引0和strlen(num)-1)来解决此问题,或使用break在打印求和后中断循环。问题在于,打印求和后不会停止内部循环。继续使用数组中的不确定元素num超出字符串终止符。这会导致未定义的行为 您可以通过不使用内部循环(通过使用索引0和strlen(num)-1)来解决此问题,或使用break在打印总和后中断循环。您有一个内部循环,用于查找数

而言,问题在于打印求和后不会停止内部循环。继续并在字符串终止符之外使用数组
num
中的不确定元素。这会导致未定义的行为


您可以通过不使用内部循环(通过使用索引
0
strlen(num)-1
)来解决此问题,或使用
break
在打印求和后中断循环。

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


您可以通过不使用内部循环(通过使用索引
0
strlen(num)-1
)来解决此问题,或使用
break
在打印总和后中断循环。

您有一个内部循环,用于查找数组中终止的空字节。您找到了它,但随后继续在数组中循环查找更多的空字节。如果您碰巧找到了一个空字节,它将取前面的字节并将其视为最后一个字节t

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

#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;
}
代码也不能处理读取过多字符的问题,这可能导致缓冲区溢出,或者读取空字符串,在这种情况下,
num[strlen(num)-1]
从数组的开头开始。您可以通过将字段宽度设置为
scanf
格式来解决前者,而后者通过显式检查来解决:

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

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

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

#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;
}
代码也不能处理读取过多字符的问题,这可能导致缓冲区溢出,或者读取空字符串,在这种情况下,
num[strlen(num)-1]
从数组的开头开始。您可以通过将字段宽度设置为
scanf
格式来解决前者,而后者通过显式检查来解决:

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

您输入的是什么?我打赌10对于输入缓冲区的大小来说太小了。以空结尾的字节字符串中的最后一个字符位于索引
strlen(num)-1
。您不需要内部循环。
scanf(“%s”,&num)
scanf(“%9s”,number)
要使用右指针并防止缓冲区溢出,请注意:
char num[10];scanf(“%s”,&num);
在C中,对数组名称的裸引用降级为数组第一个字节的地址。因此:
scanf(“%s”,&num);
正在询问地址的地址。您的编译器应该已经告诉您这个问题。建议:
scanf(“%s”,num)
注意数组前面没有
&
name@user3629249--在大多数表达式中,数组标识符衰减为指针,但当它们是一元
&
运算符的操作数时,它们不会衰减为指针。在这种情况下,返回数组的地址。这里仍然错误,不是因为它是地址的地址,而是因为它是地址的地址这是因为类型错误,即它是数组的地址。您输入的是什么?我打赌10对于输入缓冲区大小来说太小了。以空结尾的字节字符串中的最后一个字符位于索引
strlen(num)-1
。您不需要内部循环。
scanf(“%s”,&num)
to
scanf(“%9s”,number)
要使用右指针并防止缓冲区溢出,请注意:
char num[10];scanf(“%s”,&num);
在C中,对数组名称的裸引用降级为数组第一个字节的地址。因此:
scanf(“%s”,&num);
正在询问地址的地址。您的编译器应该已经告诉您这个问题。建议:
scanf(“%s”,num)
注意数组前面没有
&
name@user3629249--在大多数表达式中,数组标识符衰减为指针,但当它们是一元
&
运算符的操作数时,它们不会衰减为指针。在这种情况下,返回数组的地址。这里仍然错误,不是因为它是地址的地址,而是因为它是地址的地址这是因为类型错误,即它是数组的地址。如果num是空字符串,会发生什么情况?@EdHeal添加了检查溢出/下溢的代码。您不需要在num@EdHeal它就在那里:
if(num[0]==0)
在这种情况下,总和应为零,如果num为空字符串会发生什么情况?@EdHeal添加了检查溢出/下溢的代码。您不需要在num@EdHeal它就在那里:
如果(num[0]==0)
在这种情况下总和应该是零