2016-08-19 53 views
-4

我跑这个代码:在printf语句中使用时,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

你觉得呢?你分析了中间结果吗?为什么不?调试器说什么?你期望什么? – Olaf

+3

'str3'对于你的第一个'strcat()'调用来说还不够大。您可能会覆盖您的其他阵列的一部分。 – Dmitri

+1

您应该在每行的第一个'printf()'格式字符串中包含换行符,而不是每行调用'printf()'两次。即:'printf(“%d”,i); printf(“\ n”);'应该是'printf(“%d \ n”,i);' –

回答

4

str2足够的空间来容纳连接值。但是,您的电话订购尝试连接到str3而不是您可能想要的(即str2)。此外,即使没有长度问题,你会得到dillsDaffo,所以进一步重新排序是必要的。

相反的:

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

试试这个:

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

UPDATE:

所有原代码的bug基本上是由试图引起尽一切努力n一条线。将这个混乱的阵容分成几个阵容要好得多。

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

通常,当我做这样的事情时,我通常分别进行每个级联。我还预习目标缓冲区,使所有concatentations可以strcat(相对于第一个需要为strcpy):

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

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

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

+0

原始代码中的所有错误基本上都是由通过尝试在一条线上完成所有事情。将这个混乱的阵容分成几个阵容要好得多。 – Lundin

+0

@Lundin我非常接近在原始文章中添加分割示例。之后,我感到内疚,我离开了它。然后,这个问题就被搁置了。无论如何,你的评论重新激励我做我想做的事。感谢您的推动... –

相关问题