为什么我的代码没有给我正确的结果

Why is my code not giving me correct results

我有这段代码应该在字符串数组中的两个连续字符串之间交换。 我得到这个输出:

adf
nmmmmmmm
gh
11kk%$#
abcd

它应该给我这个输出

adf
nmmmmmmmMMMMMM
gh
11kk%$#
abcd

这是我的代码:

#include <stdio.h>

void swap( char **t1,char **t2)
{
    char *t;
    t = *t1;

    *t1 = *t2;
    *t2 =t;
}

int main() {
    char array[][21]={"abcd","adf","nmmmmmmmMMMMMM","gh","11kk%$#"};
    
    for(int i=0;i<4;i++){
        swap(&array[i],&array[i+1]);
    }
    
    for(int i=0;i<5;i++){
        printf("%s\n",array[i]);
    }
    
    return 0;
}

有人知道为什么吗?

函数声明和调用不正确。

在本次通话中

swap(&array[i],&array[i+1]);

参数的类型为 char ( * )[21],而函数参数的类型为 char **。并且没有从一种类型到另一种类型的隐式转换。

您需要的是通过使用标准 C 字符串函数交换字符数组的内容来交换字符串 strcpy

函数可以通过以下方式声明和定义

#include <string.h>

//...

enum { N = 21 };

void swap( char *t1, char *t2 )
{
    char t[N];
    strcpy( t, t1 );
    strcpy( t1, t2 );
    strcpy( t2, t );
}

函数应该像

那样调用
swap( array[i], array[i+1]);

这是一个演示程序。

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

enum { N = 21 };

void swap( char *t1, char *t2 )
{
    char t[N];
    strcpy( t, t1 );
    strcpy( t1, t2 );
    strcpy( t2, t );
}

int main(void) 
{
    char array[][N] = { "abcd", "adf", "nmmmmmmmMMMMMM", "gh", "11kk%$#" };
    
    for(int i=0;i<4;i++){
        swap( array[i], array[i+1] );
    }
    
    for(int i=0;i<5;i++){
        puts( array[i] );
    }
    
    return 0;
}

程序输出为

adf
nmmmmmmmMMMMMM
gh
11kk%$#
abcd