|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#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[i]);
}
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[i], myArray[j]) > 0)//使用strcpy交换失败
{
strcpy(tmp, myArray[i]); //myArray[i]和myArray[j]不是指针吗 使用strcpy将两个指针指向的内存块交换,但是这里却编译失败出异常
strcpy(myArray[i], myArray[j]);
strcpy(myArray[j], 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");
}
本帖最后由 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[8];
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[][30], int num) //
{
int i;
for (i = 0; i < num; ++i)
{
printf("%s\n", myArray[i]);
}
printf("\n");
}
//void sort_Arr(char** myArray, int num)
void sort_Arr(char myArray[][30], int num) // myArray[][30]是一个字符串数组变量,这样其内部的字符串才可以进行strcpy。30是自己设置的一个长度,表示每个字符串最大长度,你可以根据需求自己定义
{
int i;
int j;
//char *tmp = "aaa" 字符串常量,不能作为strcpy的目标字符串变量
char tmp[100]; // 同样,要进行字符串复制,tmp也必须是个变量
for (i = 0; i < num; i++)
{
for (j = i + 1; j < num; j++)
{
if (strcmp(myArray[i], myArray[j]) > 0)
{
strcpy(tmp, myArray[i]);
strcpy(myArray[i], myArray[j]);
strcpy(myArray[j], tmp);
}
}
}
}
void main()
{
int num = 4;
//char** pArray = { "aaaaa","ccccc","bbbbb","11111" }; // 这种定义是定义了一个字符串指针数组,数组中每个字符串指针指向一个字符串常量,因此pArray[i]指向的空间不能进行后续赋值
char pArray[4][30] = { "aaaaa","ccccc","bbbbb","11111" };//定义一个由4个字符数组组成字符串数组变量,每个元素是一个最多能够存储30个字符的字符数组
printf("排序之前\n");
print_Arr(pArray, num);
sort_Arr(pArray, num);
printf("排序之后\n");
print_Arr(pArray, num);
system("pause");
}
|
|