我是编程初学者,今天我尝试用某种原始的强力逻辑交换两个字符串。但我偶然发现了这种行为:
我的代码:
#include <stdio.h>
#include <string.h>
int main()
{
char s1[] = "Banned Playbird" ;
char s2[] = "Banned Birds" ;
void swap(char*,char*) ;
swap(s1,s2) ;
printf("s1 is now: ") ;
puts(s1) ;
printf("s2 is now: ") ;
puts(s2) ;
return 0 ;
}
void swap(char* s1,char* s2)
{
int i ;
int max = (strlen(s1)>strlen(s2)?strlen(s1):strlen(s2)) + 1 ;
for(i=0;i<max;i++)
{
printf("i = %d\n-X-X-X-X-X-X\n",i) ;
printf("s1[%d] = %d or %c\ns2[%d] = %d or %c\n",i,s1[i],s1[i],i,s2[i],s2[i]) ;
char temp = s1[i] ;
s1[i] = s2[i] ;
s2[i] = temp ;
printf("i = %d\n-X-X-X-X-X-X\n",i) ;
printf("s1[%d] = %d or %c\ns2[%d] = %d or %c\n-X-X-X-X-X-X\n\n",i,s1[i],s1[i],i,s2[i],s2[i]) ;
}
}
输出:
i = 0
-X-X-X-X-X-X
s1[0] = 66 or B
s2[0] = 66 or B
i = 0
-X-X-X-X-X-X
s1[0] = 66 or B
s2[0] = 66 or B
-X-X-X-X-X-X
i = 1
-X-X-X-X-X-X
s1[1] = 97 or a
s2[1] = 97 or a
i = 1
-X-X-X-X-X-X
s1[1] = 97 or a
s2[1] = 97 or a
-X-X-X-X-X-X
i = 2
-X-X-X-X-X-X
s1[2] = 110 or n
s2[2] = 110 or n
i = 2
-X-X-X-X-X-X
s1[2] = 110 or n
s2[2] = 110 or n
-X-X-X-X-X-X
i = 3
-X-X-X-X-X-X
s1[3] = 110 or n
s2[3] = 110 or n
i = 3
-X-X-X-X-X-X
s1[3] = 110 or n
s2[3] = 110 or n
-X-X-X-X-X-X
i = 4
-X-X-X-X-X-X
s1[4] = 101 or e
s2[4] = 101 or e
i = 4
-X-X-X-X-X-X
s1[4] = 101 or e
s2[4] = 101 or e
-X-X-X-X-X-X
i = 5
-X-X-X-X-X-X
s1[5] = 100 or d
s2[5] = 100 or d
i = 5
-X-X-X-X-X-X
s1[5] = 100 or d
s2[5] = 100 or d
-X-X-X-X-X-X
i = 6
-X-X-X-X-X-X
s1[6] = 32 or
s2[6] = 32 or
i = 6
-X-X-X-X-X-X
s1[6] = 32 or
s2[6] = 32 or
-X-X-X-X-X-X
i = 7
-X-X-X-X-X-X
s1[7] = 80 or P
s2[7] = 66 or B
i = 7
-X-X-X-X-X-X
s1[7] = 66 or B
s2[7] = 80 or P
-X-X-X-X-X-X
i = 8
-X-X-X-X-X-X
s1[8] = 108 or l
s2[8] = 105 or i
i = 8
-X-X-X-X-X-X
s1[8] = 105 or i
s2[8] = 108 or l
-X-X-X-X-X-X
i = 9
-X-X-X-X-X-X
s1[9] = 97 or a
s2[9] = 114 or r
i = 9
-X-X-X-X-X-X
s1[9] = 114 or r
s2[9] = 97 or a
-X-X-X-X-X-X
i = 10
-X-X-X-X-X-X
s1[10] = 121 or y
s2[10] = 100 or d
i = 10
-X-X-X-X-X-X
s1[10] = 100 or d
s2[10] = 121 or y
-X-X-X-X-X-X
i = 11
-X-X-X-X-X-X
s1[11] = 98 or b
s2[11] = 115 or s
i = 11
-X-X-X-X-X-X
s1[11] = 115 or s
s2[11] = 98 or b
-X-X-X-X-X-X
i = 12
-X-X-X-X-X-X
s1[12] = 105 or i
s2[12] = 0 or
i = 12
-X-X-X-X-X-X
s1[12] = 0 or
s2[12] = 105 or i
-X-X-X-X-X-X
i = 13
-X-X-X-X-X-X
s1[13] = 114 or r
s2[13] = 66 or B
i = 13
-X-X-X-X-X-X
s1[13] = 66 or B
s2[13] = 114 or r
-X-X-X-X-X-X
i = 14
-X-X-X-X-X-X
s1[14] = 100 or d
s2[14] = 97 or a
i = 14
-X-X-X-X-X-X
s1[14] = 97 or a
s2[14] = 100 or d
-X-X-X-X-X-X
i = 15
-X-X-X-X-X-X
s1[15] = 0 or
s2[15] = 110 or n
i = 15
-X-X-X-X-X-X
s1[15] = 110 or n
s2[15] = 0 or
-X-X-X-X-X-X
s1 is now: rd
s2 is now: Banned Playbird
我添加了调试打印语句来检查发生了什么。一切似乎都很好,并且都应该打印,直到在交换的字符串中达到 ' ' 字符,但由于某种原因 s1 被省略并占用 s2 的最后 2 个字符。在 i = 12 时,s1 的“i”与 s2 的空字符交换,在 i = 15 时,s1 的空字符与 s2[15] 中的某个未定义值交换。
有趣的是,只有在 'i' 超出 s1 和 s2 的共同长度之后,这种情况才开始发生。我想知道我的代码中可能存在的错误。
正如评论中已经指出的,两个数组都需要足够大才能容纳最大字符串的内容。你可以让它们都相当大,很容易:
int main(void)
{
char s1[100] = "Small string";
char s2[100] = "A somewhat larger string";
现在您可以应用交换算法。
算法思考:
当您遇到空终止符(
\0
)时,您需要停止交换值,但是有两个:您应该停止在哪一个?
如果字符串相同长度怎么办?如何判断它们是否相同?
您可以通过单个
for
或 while
循环来完成所有这些工作。
void swap( char * a, char * b )
{
//loop goes here
}
摆脱所有
printf()
之类的东西。在这一点上,它只是妨碍你。
请记住,拿出一张纸并画出您期望发生的事情,至少一次。