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

时间:2016-08-19 02:17:33

标签: c string strcmp strcpy strcat

我运行了这段代码:

#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会返回“弊病”?
  3. 即使strcat(str3,strcpy(str2,str1))返回Daffodillsills但strcmp的答案是0.为什么?

1 个答案:

答案 0 :(得分:4)

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

而不是:

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

试试这个:

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

<强>更新

  

原始代码中的所有错误主要是由于尝试在一行中执行所有操作。把这个杂乱的阵容分成几个就好了。

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

通常,当我做这些事情时,我通常会分别进行每个连接。我还准备了目标缓冲区,以便所有连接都可以strcat(与第一个需要strcpy的连接):

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

对我来说,这更清晰,更简单,更灵活。更灵活,因为如果需要添加更多连接是一件简单的事情,或者如果它们不按顺序重新排序它们。

与C中的许多类似序列一样,优化器将生成与long / compound语句一样有效的代码。