琴长不过时光 发表于 2020-3-1 13:35:15

strcpy函数中放指针的问题

#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

void print_Arr(char** myArray, int num)
{
        int i;
        for (i = 0; i < num; ++i)
        {
                printf("%s\n", myArray);
        }
        printf("\n");
}

void sort_Arr(char** myArray, int num)
{
        int i;
        int j;
        char* tmp = "aaa";
        for (i = 0; i < num; ++i)
        {
                for (j = i + 1; j < num; ++j)
                {
                        if (strcmp(myArray, myArray) > 0)//使用strcpy交换失败
                        {
                                strcpy(tmp, myArray);//myArray和myArray不是指针吗 使用strcpy将两个指针指向的内存块交换,但是这里却编译失败出异常
                                strcpy(myArray, myArray);
                                strcpy(myArray, tmp);
                        }
                }
        }

}

void main()
{
        int num = 4;
        char* pArray[] = { "aaaaa","ccccc","bbbbb","11111" };//将字符串从小到大排序
        printf("排序之前\n");
        print_Arr(pArray, num);

        sort_Arr(pArray, num);

        printf("排序之后\n");
        print_Arr(pArray, num);

        system("pause");
}

琴长不过时光 发表于 2020-3-1 13:36:13

//myArray和myArray不是指针吗 使用strcpy将两个指针指向的内存块交换,但是这里却编译失败出异常

琴长不过时光 发表于 2020-3-1 13:55:08

major_lyu 发表于 2020-3-1 18:10:57

本帖最后由 major_lyu 于 2020-3-1 18:27 编辑

不是strcpy的问题。
是因为你main里面定义的
char* pArray[] = { "aaaaa","ccccc","bbbbb","11111" };。pArray中的每个指针指向的都是一个字符串常量啊。
同样char *tmp="aaa"也是个字符串常量,并且只占三个字符的空间。

字符串常量是在编译的时候分配空间并赋值,而且是放在内存常量区的。所谓常量就是初始化之后在程序运行过程中不能改变的。你把一个字符串复制到一个常量中是不能完成的,就类似你进行了1=2这种操作,要进行赋值,赋值对象必须是一个变量,例如a=2, a的值是可变的。而1是常量,1=2是没有意义的赋值。

类似的char *tmp="aaa",字符串“aaa"存储的空间中的值在程序运行过程中用于都是”aaa“, 是不能改变的,而tmp是一个指针变量,它可以指向别的地址空间,也就tmp的值可以该,但是当tmp指向”aaa“所在的空间时,其所指的字符串是不能改变的。而如果你通过改变tmp的值,使其指向一个字符数组,例如
char *tmp="aaa";
char str;
tmp = str;
这时, tmp指向的str是一个字符数组变量,其内部的数据时可以改变的,而“aaa”所在的空间依然存在。只是tmp不再指向它了而已。

所以呢,strcpy()函数中的目标字符串必须是个字符数组,而不能是一个字符串常量

更改后的代码,修改的地方见注释

#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

//void print_Arr(char** myArray, int num)
void print_Arr(char myArray[], int num)//
{
      int i;
      for (i = 0; i < num; ++i)
      {
                printf("%s\n", myArray);
      }
      printf("\n");
}
//void sort_Arr(char** myArray, int num)
void sort_Arr(char myArray[], int num) // myArray[]是一个字符串数组变量,这样其内部的字符串才可以进行strcpy。30是自己设置的一个长度,表示每个字符串最大长度,你可以根据需求自己定义
{
      int i;
      int j;
      //char *tmp = "aaa" 字符串常量,不能作为strcpy的目标字符串变量
      char tmp; // 同样,要进行字符串复制,tmp也必须是个变量
      for (i = 0; i < num; i++)
      {
                for (j = i + 1; j < num; j++)
                {
                        if (strcmp(myArray, myArray) > 0)
                        {
                              strcpy(tmp, myArray);
                              strcpy(myArray, myArray);
                              strcpy(myArray, tmp);
                        }
                }
      }

}

void main()
{
      int num = 4;
      //char** pArray = { "aaaaa","ccccc","bbbbb","11111" }; // 这种定义是定义了一个字符串指针数组,数组中每个字符串指针指向一个字符串常量,因此pArray指向的空间不能进行后续赋值
      char pArray = { "aaaaa","ccccc","bbbbb","11111" };//定义一个由4个字符数组组成字符串数组变量,每个元素是一个最多能够存储30个字符的字符数组
      printf("排序之前\n");
      print_Arr(pArray, num);

      sort_Arr(pArray, num);

      printf("排序之后\n");
      print_Arr(pArray, num);

      system("pause");
}

人造人 发表于 2020-3-1 18:25:34

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

void print_Arr(char **myArray, int num)
{
      int i;
      for (i = 0; i < num; ++i)
      {
                printf("%s\n", myArray);
      }
      printf("\n");
}

void sort_Arr(char **myArray, int num)
{
      int i;
      int j;
      char *tmp;
      for (i = 0; i < num; ++i)
      {
                for (j = i + 1; j < num; ++j)
                {
                        if (strcmp(myArray, myArray) > 0)
                        {
                                tmp = myArray;
                                myArray = myArray;
                                myArray = tmp;
                        }
                }
      }

}

int main()
{
      int num = 4;
      char* pArray[] = { "aaaaa","ccccc","bbbbb","11111" };//将字符串从小到大排序
      printf("排序之前\n");
      print_Arr(pArray, num);

      sort_Arr(pArray, num);

      printf("排序之后\n");
      print_Arr(pArray, num);
        return 0;
}
页: [1]
查看完整版本: strcpy函数中放指针的问题