为什么在输出后会得到一些随机值? #包括 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)
toscanf(“%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)
在这种情况下总和应该是零