繁体   English   中英

字符串 - strcpy、strcat 等函数

[英]Character strings - Functions like strcpy, strcat

我想解释输出和点和错误(如果有的话)。 我对一些术语有点困惑,因为我刚开始使用字符串。

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);

输出: *a1b2c3d4e511111111111*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);

输出: *->+ for 1st printf 因为 nul 之后的任何东西都被丢弃了? 我需要一些关于第二个 printf 的帮助。 是语句 strcat(str1,&(str2[2])); 错误声明? & 不应该应用于数组,因为它本质上是一个指针本身? 谁能给我解释一下这部分?

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");

回答第一个问题:

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' 此数组不是字符串,因为它不包含空字符'\\0'

printf("%s\\n", str2)期望str2包含空字符。 由于str2未能满足该契约,结果是未定义行为UB。

OP的推理可以很好地解释"11111111111*a1b2c3d4e5"的输出,但它仍然是UB。 这意味着明天,输出可能会有所不同,在另一台机器上,输出可能会有所不同,它可能会崩溃并烧毁。 由于每天不同的原因,它可能是相同的"11111111111*a1b2c3d4e5"

需要明确的是:由于代码不符合 C 约定,因此输出可能是任何原因,也可能是任何原因

暂无
暂无

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

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