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

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 javaFX利用scene builder的fxml文件进行开发时的label setText方法未生效问题
  • ¥15 notepad++ 自动补全提示,如输入汉字"人名",就会出现"张三","李四"
  • ¥15 如何用matlab实现PSO算法与两种智能优化算法在30维和50维问题上的性能比较?
  • ¥15 在qt的QGraphicsView和QGraphicsScene中遇到的问题
  • ¥50 如何完美解决谷歌礼品卡支付不被检测
  • ¥15 nslt的可用模型,或者其他可以进行推理的现有模型
  • ¥15 arduino上连sim900a实现连接mqtt服务器
  • ¥15 vncviewer7.0安装后如何正确注册License许可证,激活使用
  • ¥15 phython如何实现以下功能?查找同一用户名的消费金额合并2
  • ¥66 关于人体营养与饮食规划的线性规划模型