王小希ww 2022-07-10 19:22 采纳率: 100%
浏览 544
已结题

C语言字符指针数组交换问题

在C语言中,指针数组中的指针变量可以实现交换吗?我不清楚是我的代码问题,还是C语言本身就不支持指针数组中指针位置的交换,下面的交换得不到想要的结果。
如题

#include <stdio.h>
#include <string.h>
#include <iostream>
#define MAXLEN 1000
using namespace std;

//字符串交换
void str_swap1(char **str1, char **str2){
    char *temp;
    temp = *str1;  //此时temp指向了*str1指针变量地址
    *str1 = *str2;   //形参中**str1是指向*str1指针的指针,*str1指针变量地址修改成了*str2指针变量地址
    *str2 = temp;  //形参中**str2是指向*str2指针的指针,*str2指针变量地址修改成了temp指针变量地址
}

//字符串按字典排序
void arr_sort(char *arr[], int len){

    int i,j;
    //插入排序
    for(i = 1; i < len; ++i){
        int index = 0;
        for(j = i; j > 0; --j){
            if(strcmp(arr[j - 1], arr[j]) > 0){
               
                int k = 0;
                cout << "交换前";
                for(k = 0; k < len; ++k){
                    cout << arr[k] << " ";
                }
                
                char *temp = arr[j - 1];
                char *temp1 = arr[j];
                str_swap1(&temp,&temp1);  //传入指针变量的地址
                printf(" swap: %s, %s",temp,temp1);

                cout << "交换后";
                for(k = 0; k < len; ++k){
                    cout << arr[k] << " ";
                }
                cout << endl;
            }
        }
    }
}

int main()
{
    int num,i;
    char *arr[num];  //字符串数组
    char str[MAXLEN];  //输入的字符串

    scanf("%d",&num);
    printf("输入%d个单词\n",num);
    for(i = 0; i < num; ++i){
       arr[i] = (char *) malloc(sizeof(char) * MAXLEN);   //如果未给arr[i]分配空间,scanf会报错:segmentation fault
       scanf("%s",arr[i]);
    }
    
    // printf("输入字符串\n");
    // scanf("%s",str);

    int j;
    cout << "排序前:" << endl;
    for(i = 0; i < num; ++i){
        cout << arr[i] << endl;
    }

    arr_sort(arr,num);

    cout << "排序后:" << endl;
    for(i = 0; i < num; ++i){
        cout << arr[i] << endl;
    }

    return 0;
}

输出结果为:

3
输入3个单词
peach
banana
apple
排序前:
peach
banana
apple
交换前peach banana apple  swap: banana, peach交换后peach banana apple 
交换前peach banana apple  swap: apple, banana交换后peach banana apple
交换前peach banana apple  swap: banana, peach交换后peach banana apple
排序后:
peach
banana
apple
  • 写回答

1条回答 默认 最新

  • a5156520 2022-07-10 20:03
    关注

    下面是我的理解,供参考:
    应该是swap函数的参数传递错误,把字符指针temp1和temp2的地址传入swap函数,交换的只是交换字符指针temp1和temp2的值,temp1和temp2里面的值虽然和数组元素相同,但是他们各自的地址却代表不同的含义,然后对这个地址的解引用操作涉及的对象也不同,所以二者不能替代,交换temp1和temp2的值不是交换字符串数组的元素的值,把相应字符串数组的元素的地址传入swap函数就可以了。
    代码修改如下:

    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <stdlib.h> 
    #define MAXLEN 1000
    using namespace std;
     
    //字符串交换
    void str_swap1(char **str1, char **str2){
        char *temp;
        temp = *str1;  //此时temp指向了*str1指针变量地址
        *str1 = *str2;   //形参中**str1是指向*str1指针的指针,*str1指针变量地址修改成了*str2指针变量地址
        *str2 = temp;  //形参中**str2是指向*str2指针的指针,*str2指针变量地址修改成了temp指针变量地址
    }
     
    //字符串按字典排序
    void arr_sort(char *arr[], int len){
     
        int i,j;
        //插入排序
        for(i = 1; i < len; ++i){
            int index = 0;
            for(j = i; j > 0; --j){
                if(strcmp(arr[j - 1], arr[j]) > 0){
                   
                    int k = 0;
                    cout << "交换前";
                    for(k = 0; k < len; ++k){
                        cout << arr[k] << " ";
                    }
    //                
    //                char *temp = arr[j - 1];
    //                char *temp1 = arr[j];
                    str_swap1(&arr[j-1],&arr[j]);  //传入指针变量的地址
                   
    //               char * temp = arr[j-1];
    //               arr[j-1]=arr[j];
    //               arr[j]=temp;
                   
                  //  printf(" swap: %s, %s",temp,temp1);
     
                    cout << "交换后";
                    for(k = 0; k < len; ++k){
                        cout << arr[k] << " ";
                    }
                    cout << endl;
                }
            }
        }
    }
     
    int main()
    {
        int num,i;
        char *arr[num];  //字符串数组
        char str[MAXLEN];  //输入的字符串
     
        scanf("%d",&num);
        printf("输入%d个单词\n",num);
        for(i = 0; i < num; ++i){
           arr[i] = (char *) malloc(sizeof(char) * MAXLEN);   //如果未给arr[i]分配空间,scanf会报错:segmentation fault
           scanf("%s",arr[i]);
        }
        
        // printf("输入字符串\n");
        // scanf("%s",str);
     
        int j;
        cout << "排序前:" << endl;
        for(i = 0; i < num; ++i){
            cout << arr[i] << endl;
        }
     
        arr_sort(arr,num);
     
        cout << "排序后:" << endl;
        for(i = 0; i < num; ++i){
            cout << arr[i] << endl;
        }
     
        return 0;
    }
    
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 7月19日
  • 已采纳回答 7月11日
  • 创建了问题 7月10日

悬赏问题

  • ¥15 PPOCRLabel
  • ¥15 网友们我该怎么办啊,急
  • ¥15 混合键合键合机对准标识
  • ¥100 现在不懂的是如何将当前的相机中的照片,作为纹理贴图,映射到扫描出的模型上
  • ¥15 目标跟踪,计算机视觉
  • ¥15 魔霸ROG7 pro,win11.息屏后会显示黑屏,如图,如何解决?(关键词-重新启动)
  • ¥15 有没有人知道这是哪里出了问题啊?要怎么改呀?
  • ¥200 C++表格文件处理-悬赏
  • ¥15 Windows Server2016本地登录失败
  • ¥15 复合卡卡号轨道写入芯片卡