如何在C中进行char *数组元素交换?

时间:2016-05-26 05:51:11

标签: c pointers swap

#include <stdio.h>
#include <stdlib.h>

char* temp=" ";
char char_array[4][100]= {"-11111","-1111","-1110","-1112"};

void str_swap(char** a,char** b);

int main(int argc,char* argv[]) {
    int j=0,n=4;

    printf("BEFORE str_swap(&char_array[0],&char_array[2]);\n");

    for (j=0; j<n; j++) {
        printf("char_array[%d] = %s\n",j,char_array[j]);
    }


    str_swap(&char_array[0],&char_array[2]);


    printf("AFTER str_swap(&char_array[0],&char_array[2]);\n");

    for (j=0; j<n; j++) {
        printf("char_array[%d] = %s\n",j,char_array[j]);
    }

    return 0;
}

void str_swap(char** str1,char** str2) {
    temp = *str1;
    *str1 = *str2;
    *str2 = temp;
}

大家好:我想在C中进行char *数组元素交换,上面是我的代码。但是我在下面显示的输出没有任何改变。我在这里遗漏了什么?感谢您的帮助。

  
    

在str_swap之前(&amp; char_array [0],&amp; char_array [2]);
char_array [0] = -11111
char_array [1] = -1111
char_array [2 ] = -1110
char_array [3] = -1112
之后     str_swap(&amp; char_array [0],&amp; char_array [2]);
char_array [0] = -11111     //应为-1110
char_array [1] = -1111
char_array [2] =     -1110 //应该是-11111
char_array [3] = -1112

  
     

处理返回0(0x0)执行时间:0.359 s
按任意键   继续。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLEN 1002
char *char_array[MAXLEN];
void str_swap(char const** str1,char const** str2);
int my_compare_func(int,int);
void bubble_sort(int,int(*compare_func)(int,int));

int main(int argc,char* argv[]) {
    int n=0,i=0,j=0;
    while(scanf("%d",&n)==1) {
        i=n;
        while(i--) {
            scanf("%s",&char_array[i]);
        }
        printf("BEFORE BULLE SORT\n");
        for (j=0; j<n; j++) {
            printf("j = %d\n",j);
            printf("char_array[%d] = %s\n",j,&char_array[j]);
            //printf("char_array[%d] = %s\n",j,char_array[j]);
        }
        bubble_sort(n,my_compare_func);
        printf("AFTER BULLE SORT\n");
        for (j=0; j<n; j++) {
            printf("j = %d\n",j);
            printf("char_array[%d] = %s\n",j,&char_array[j]);
            //printf("char_array[%d] = %s\n",j,char_array[j]);
        }    
        system("PAUSE"); 
    }  
    return 0; 
}

int my_compare_func(int x,int y) {
    int i=0,res = 0,len_strx=0,len_stry=0;
    len_strx = strlen(char_array[x]);
    len_stry = strlen(char_array[y]);
    if(char_array[x][0]=='-') {
        if(char_array[y][0]=='-') {
            if(len_strx>len_stry) {
                res = -1;
            }else if(len_strx<len_stry) {
                res = 1;
            }else if(len_strx==len_stry) {
                i=1;
                while((char_array[x][i]==char_array[y][i])&&(char_array[x][i]!='\0')&&(char_array[y][i]!='\0')) {
                    ++i;
                }
                if(i==len_strx) {
                    res = 0;
                }else if(char_array[x][i]<char_array[y][i]){
                    res = 1;
                }else if(char_array[x][i]>char_array[y][i]) {
                    res = -1;
                }
            }         
        }else if((char_array[y][0]>='0'&&char_array[y][0]<='9')||char_array[y][0]=='+'){
            res = -1;        
        }
    }else if((char_array[x][0]>='0'&&char_array[x][0]<='9')||char_array[x][0]=='+') {
        if((char_array[y][0]>='0'&&char_array[y][0]<='9')||char_array[y][0]=='+'){
            if(len_strx>len_stry) {
                res = 1;
            }else if(len_strx<len_stry) {
                res = -1;
            }else if(len_strx==len_stry) {
                i=0;
                while(char_array[x][i]==char_array[y][i]&&char_array[x][i]!='\0'&&char_array[y][i]!='\0') {
                    ++i;
                }
                if(i==len_strx) {
                    res = 0;
                }else if(char_array[x][i]<char_array[y][i]){
                    res = -1;
                }else if(char_array[x][i]>char_array[y][i]){
                    res = 1;
                }
            }
        }else if(char_array[y][0]=='-') {
            res = 1;
        }
    }
    return res;    
}

void str_swap(char const** str1,char const** str2) {
    char const* temp = *str1;
    *str1 = *str2;
    *str2 = temp ; 
}

void bubble_sort(int n,int(*compare_func)(int x,int y)) {
    int i=0,j=0,flag=1;
    for(i=n-1; (i>0)&&(flag==1); --i) {
        flag=0;
        for(j=0; j<i; ++j) {
            if(compare_func(j,j+1)>0) {
                str_swap(&char_array[j],&char_array[j+1]);
                flag = 1;
            }
         }  
         if(!flag) {
             break;
         }
    }
}
  

感谢您的所有答案。您的回复非常快。事实上我是   试图解决基本的在线判断问题。请在这里查看:(普通话)   http://zerojudge.tw/ShowProblem?problemid=a528
  基本上这是一个存储大数字的字符串的排序问题(两者都有   积极和消极)。抱怨发布如此庞大的数额   code.fast.My新问题是,当我的代码运行到行时:
    // printf(“char_array [%d] =%s \ n”,j,&amp; char_array [j]);

    printf(“char_array [%d] =%s \ n”,j,char_array [j]);
  然后控制台应用程序崩溃了!我尝试了一些类似的方法   注释行(即将printf()函数中的%s部分设置为   &amp; char_array [j])。它工作正常,但与我对论证的认识相矛盾> printf()。任何人都可以为我解释一下吗?谢谢:)

3 个答案:

答案 0 :(得分:2)

您提供的代码无法编译,&char_array[0]的类型不是char**函数期望得到的str_swap。基本上你可以通过进行这些改变来实现你想要的东西:

#include <string.h>

char temp[100];
...
void str_swap(char* a,char* b);
...
str_swap(char_array[0],char_array[2]);//you don't need to use the & operator here
...
void str_swap(char* str1,char* str2) 
{
   strncpy(temp,str1,100);//copy the first to temp
   strncpy(str1,str2,100);//copy the second to the first
   strncpy(str2,temp,100);
}

答案 1 :(得分:2)

是的,你在这里遗漏了一些东西。 char [4][100]是一个数组数组,而不是一个指针数组。你的函数需要指针的地址,而不是数组的地址(数组不是指针)。

将数组更改为const char*数组(指向常量字符数据的指针),并且您的函数正确地交换指向该类型指针的指针将解决您的问题。

#include <stdio.h>
#include <stdlib.h>

char const *char_array[4] = {"-11111","-1111","-1110","-1112"};

void str_swap(char const ** str1,char const ** str2);

int main(int argc,char* argv[])
{
    int j=0,n=4;

    printf("BEFORE str_swap(&char_array[0],&char_array[2]);\n");

    for (j=0; j<n; j++) {
        printf("char_array[%d] = %s\n",j,char_array[j]);
    }


    str_swap(&char_array[0], &char_array[2]);


    printf("AFTER str_swap(&char_array[0],&char_array[2]);\n");

    for (j=0; j<n; j++) {
        printf("char_array[%d] = %s\n",j,char_array[j]);
    }

    return 0;
}

void str_swap(char const ** str1, char const ** str2)
{
    char const *temp = *str1;
    *str1 = *str2;
    *str2 = temp;
}

<强>输出

BEFORE str_swap(&char_array[0],&char_array[2]);
char_array[0] = -11111
char_array[1] = -1111
char_array[2] = -1110
char_array[3] = -1112
AFTER str_swap(&char_array[0],&char_array[2]);
char_array[0] = -1110
char_array[1] = -1111
char_array[2] = -11111
char_array[3] = -1112

你的原始代码如何运行是一个谜,因为我使用的C编译器不会允许你甚至编译甚至编译,更不用说运行了。

答案 2 :(得分:2)

要编译代码,你必须将矩阵更改为一个指向文字c-string的指针数组,所以

char char_array[4][100]= {"-11111","-1111","-1110","-1112"};

必须是

char *char_array[4]= {"-11111","-1111","-1110","-1112"};

您的代码应为

#include <stdio.h>
#include <stdlib.h>

char *char_array[]= {"-11111","-1111","-1110","-1112"};

#define ARRAY_SIZE  sizeof(char_array)/sizeof(char_array[0])

void str_swap(char** a,char** b);

int main() {
    size_t j=0;

    printf("BEFORE str_swap(&char_array[0],&char_array[2]);\n");

    for (j=0; j<ARRAY_SIZE; j++) {
        printf("char_array[%zu] = %s\n",j,char_array[j]);
    }

    str_swap(&char_array[0],&char_array[2]);


    printf("AFTER str_swap(&char_array[0],&char_array[2]);\n");

    for (j=0; j<ARRAY_SIZE; j++) {
        printf("char_array[%zu] = %s\n",j,char_array[j]);
    }

    return 0;
}

void str_swap(char** str1, char** str2) {
    char* temp;
    temp = *str1;
    *str1 = *str2;
    *str2 = temp;
}

输出

BEFORE str_swap(&char_array[0],&char_array[2]);
char_array[0] = -11111
char_array[1] = -1111
char_array[2] = -1110
char_array[3] = -1112
AFTER str_swap(&char_array[0],&char_array[2]);
char_array[0] = -1110
char_array[1] = -1111
char_array[2] = -11111
char_array[3] = -1112