在 C 中交换字符串时出现意外行为

问题描述 投票:0回答:1

我是编程初学者,今天我尝试用某种原始的强力逻辑交换两个字符串。但我偶然发现了这种行为:

我的代码:

#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 的共同长度之后,这种情况才开始发生。我想知道我的代码中可能存在的错误。

c c-strings swap
1个回答
0
投票

正如评论中已经指出的,两个数组都需要足够大才能容纳最大字符串的内容。你可以让它们都相当大,很容易:

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()
之类的东西。在这一点上,它只是妨碍你。

请记住,拿出一张纸并画出您期望发生的事情,至少一次。

© www.soinside.com 2019 - 2024. All rights reserved.