鱼C论坛

 找回密码
 立即注册
查看: 919|回复: 4

[已解决]strcpy函数中放指针的问题

[复制链接]
发表于 2020-3-1 13:35:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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");
}
最佳答案
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[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");
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-1 13:36:13 | 显示全部楼层
//myArray[i]和myArray[j]不是指针吗 使用strcpy将两个指针指向的内存块交换,但是这里却编译失败出异常
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-1 13:55:08 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[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");
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[i]);
        }
        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[i], myArray[j]) > 0)
                        {
                                tmp = myArray[i];
                                myArray[i] = myArray[j];
                                myArray[j] = 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 01:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表