我想解释输出,现场和错误,如果有的话。我有点混淆了一些术语,因为我刚开始使用字符串。
int i, val;
char str1[15] = "*";
char str2[10] = "";
初始化适用于所有问题。
a.
strcat(str1,"a1b2c3d4e5");
printf("%s\n",str1);
for (i=0; i < 10; i++)
str2[i] = '1';
printf("%s\n",str2);
输出: * a1b2c3d4e5 和 11111111111 * a1b2c3d4e5 。对于第二个printf,为什么它包含* a1b2c3d4e5?是因为nul(\ 0)被省略,因为循环执行10次,这正是数组大小,第11个数组大小未初始化。
b.
strcat(str2,str1);
strcpy(str1,"Hello!");
strcat(str2,str1);
printf("%s\n",str2);
输出:只需 *您好!
c.
strcat(str2,"*->+12345");
str2[4] = '\0';
printf("%s\n",str2);
strcat(str1,&(str2[2]));
printf("%s\n",str1);
第一个printf的输出: * - &gt; + ,因为nul之后的任何内容都被丢弃了?我需要一些帮助第二个printf。语句是strcat(str1,&amp;(str2 [2]));错误陈述? &amp;不应该应用于数组,因为它本质上是一个指针本身?任何人都可以向我解释这一部分吗?
d.
str1[1] = '5';
str1[2] = '6';
str1[3] = '7';
i=1;
val=0;
while (str1[i] != '\0') {
val += str1[i]-'0';
i++;
}
for (i=0; i < val; i++)
str2[i] = str1[0];
printf("%s\n",str2);
d和e部分的一些帮助?
e. strcat(str1,"ABCDEFGH");
strcat(str2,"abcdefghi");
for (i=0; i < 9; i++) {
if (str1[i] < str2[i])
str1[i] += 40;
}
if (strcmp(str1,str2) < 0)
printf("str1 < str2 \n");
else if (strcmp(str1,str2) == 0)
printf("str1 == str2 \n");
else
printf("str1 > str2 \n");
答案 0 :(得分:0)
回答第一个问题:
int i;
char str2[10] = "";
for (i=0; i < 10; i++)
str2[i] = '1';
printf("%s\n",str2); // Output: 11111111111*a1b2c3d4e5.
为什么它包含
*a1b2c3d4e5
?是因为省略'\0'
因为循环执行了10次,这正是数组大小而第11个数组大小没有初始化?
在for()
之后,str2()
填充了'1'
,'1'
,'1'
,'1'
,'1'
,{ {1}},'1'
,'1'
,'1'
,'1'
。此数组不是字符串,因为它不包含空字符'1'
。
'\0'
期望printf("%s\n", str2)
包含空字符。由于str2
无法满足该合同,因此结果是未定义的行为 UB。
OP的推理可以很好地解释str2
的输出,但它仍然是UB。这意味着明天,输出可能会有所不同,在另一台机器上,输出可能会有所不同,可能会崩溃并烧毁。由于每天都有不同的原因,它可能是相同的"11111111111*a1b2c3d4e5"
。
要明确:由于代码不遵循C合同,输出可以是任何内容,出于任何原因。