gpt4 book ai didi

c - 在 printf 语句中使用 strcpy 或 strcat 时,是否会对字符串进行不必要的更改?

转载 作者:行者123 更新时间:2023-11-30 21:16:07 25 4
gpt4 key购买 nike

我运行了这段代码:

#include<stdio.h>
#include<string.h>

int main()
{
static char str1[] = "dills";
static char str2[20];
static char str3[] = "Daffo";
int i,j;
i = strcmp(strcat(str3, strcpy(str2, str1)), "Daffodills");
printf("%d", i);printf("\n");
printf("%s",str1);printf("\n");
printf("%s",str2);printf("\n");
printf("%s",str3);printf("\n");
printf("%s",strcpy(str2, str1));printf("\n");
printf("%s",strcat(str3, strcpy(str2, str1)));
return 0;
}

输出:

0
ills
dills
Daffodills
ills
Daffodillsills
  1. str1 如何成为“弊病”?
  2. 为什么 strcpy 返回“ills”?
  3. 即使 strcat(str3, strcpy(str2, str1)) 返回 Daffodillsills 但 strcmp 的答案是 0。为什么?

最佳答案

您在 str2确实有足够的空间来包含连接的值。但是,您的调用顺序尝试连接到 str3 而不是您可能想要的(即 str2)。另外,即使没有长度问题,您也会得到 dillsDaffo,因此需要进一步重新排序。

而不是:

i = strcmp(strcat(str3, strcpy(str2, str1)), "Daffodills");

试试这个:

i = strcmp(strcat(strcpy(str2, str3), str1), "Daffodills");
<小时/>

更新:

All the bugs in the original codes are essentially caused by trying to do everything on one single line. It would be much better to split that messy line up in several.

是的。我正在讨论对此进行编辑。所以,这里是......

通常,当我做这样的事情时,我通常会单独进行每个串联。我还准备了目标缓冲区,以便所有连接都可以是 strcat(相对于第一个需要是 strcpy):

str2[0] = 0;
strcat(str2,str3);
strcat(str2,str1);
i = strcmp(str2,"Daffodills");

对我来说,这更清晰、更简单、更灵活。更灵活,因为如果需要的话添加更多串联或在它们不按顺序排列时重新排序是一件简单的事情。

与 C 中的许多类似序列一样,优化器将生成与长/复合语句一样高效的代码。

关于c - 在 printf 语句中使用 strcpy 或 strcat 时,是否会对字符串进行不必要的更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39030159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com