c语言strcpy将一个结构体的数据复制到另一个后,出问题了

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言strcpy将一个结构体的数据复制到另一个后,出问题了相关的知识,希望对你有一定的参考价值。

我用strcpy将一个结构体的数据复制到另一个结构体,有个疑问是,第一次输入占用空间小的数据程序正常,而第二次输入占用空间大点的数据,程序就出错了,这是怎么回事?难道第一次输入数据后strcpy就将空间确定?下面是部分主要程序:

customer1=(struct cus*)malloc(sizeof(struct cus));
scanf("%s%s%s",customer1->customer_0.name,customer1->customer_0.card,customer1->customer_0.num);
getchar();
system("cls");
head0=air_read();
p0=head0;
while(p0!=NULL)

if(strcmp(p0->num,customer1->customer_0.num)==0)

strcpy(customer1->air_0.name,p0->name);
strcpy(customer1->air_0.num,p0->num);
strcpy(customer1->air_0.fly,p0->fly);
strcpy(customer1->air_0.aim,p0->aim);
strcpy(customer1->air_0.kind,p0->kind);
strcpy(customer1->air_0.time,p0->time);
strcpy(customer1->air_0.food,p0->food);
customer1->air_0.price=p0->price;
break;

p0=p0->next;

这属于C++的范畴,虽然我C++学得也是半斤八两,但是这段代码我还是基本上过得去。

我假设你是有一定的C编程基础,所以就只回答你空间描述的不懂的地方了,每句都翻译枯燥而且也会感觉不知所云。还有什么不懂的,欢迎提问,我有足够的耐性和信心让你搞明白,呵呵^!^

C++中主要是比C多了面向对象的概念。
#include <*****> 表示的是将*****头文件包含进来
#include "*****" 功能一样,只是他们索引文件的方式不一样,初学者不必深究。
*****头文件里面定义了常用的一些预处理,结构体,类等等,可以方便大家直接使用不再定义他们。你可以搜索*****找到它打开看看里面的内容,不要随意修改他们哦,否则你以后写程序要出问题的哟,呵呵。

using namespace std;
表示要用到的一些关键字所在的命名空间
因为用到了cout所以必须加上这句话。

定义了一个Student类,定义类的时候除了可以定义一些变量,还可以定义一些接口,变量和接口都可以用private,public,protected来定义访问 以及 继承权限的。
其实接口更直接一点就是一个函数,或者说成指向函数的指针变量也可以,主要看你怎么理解了。
int student::jud() ::表示域限定符,用::定义了一个接口(也就是函数),表示这个函数是属于student类的。
同时student类中还定义了一个student()函数,是构造函数,语法规定必须和类名字相同。构造函数的主要作用是类实例化的时候初始化变量,也就是在创建对象的要用到的。

loop: printf("****");
loop:表示的是一个标号,后面用goto loop 跳转到loop:位置执行printf("****");
你完全可以把loop替换成别的东西,比如xunhuan,呵呵

cout 用来控制输出
<<连接各个参数,
cint 用来控制输入
>>连接各个参数。参数和printf ,scanf 是相一致的。

system("***"); 可以调用一些命令行,如cls 清屏 ,pause 暂停 还可以创建进程等等。

好像差不多没了,其他东西基本都是C语言知识了

PS:
其实C++的类和C语言的结构体非常相似,类可以定义函数接口,但是结构体不行
其实我们在结构体中也可以变相的实现定义函数的嘛,比如定义一个函数指针变量。
唯一不同的就是C++的类多了继承的概念,一个类可以继承另一个类的一些属性
而且在继承的过程中还有private,public,protected等权限。

当然C++除了类之外还有STL等一些比较高级的东东值得学习,巧妙的使用他们可以加快项目进度,提升项目效率,C++真的是很好很强大。
参考技术A strcpy函数是用于字符串复制的,不能用于结构体的复制。
1、C语言标准库函数strcpy,把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间。直观表示为strcpy(狗,赋值内容)实现对文字变量""狗""的赋值,以区别于普通数字的形式赋值。
2、原型声明:extern char *strcpy(char* dest, const char *src);
头文件:#include <string.h> 和 #include <stdio.h>
功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。"
参考技术B 你的struct cus的成员变量是声明为数组还是指针,如果是指针,要另外再对其分配内存。追问

struct cus

struct customer customer_0;
struct air_time air_0;
struct cus *next;
;
不是指针

参考技术C 原因是 (sizeof(struct cus)) 中 计算时 字符串是按指针计算的 相当于char*,你应该用 char sz[1024]的方式。明白了?本回答被提问者采纳 参考技术D customer1->air_0.name = (char*)malloc((strlen(p0->name)+1)*sizeof(char))这样重新分配一段内存。。

C语言--strcpy()函数

strcpy,即string copy(字符串复制)的缩写。
strcpy是一种C语言的标准库函数,strcpy把含有‘\0‘结束符的字符串复制到另一个地址空间,返回值的类型为char*。

C语言 strcpy() 函数用于对字符串进行复制(拷贝)。

头文件:string.h

语法/原型:

char* strcpy(char* strDestination, const char* strSource);

参数说明:

  • strDestination:目的字符串。
  • strSource:源字符串。


strcpy() 会把 strSource 指向的字符串复制到 strDestination。

必须保证 strDestination 足够大,能够容纳下 strSource,否则会导致溢出错误。

返回值:目的字符串,也即 strDestination。

【实例】使用C语言 strcpy() 函数将字符串 src 复制到 dest。

#include <stdio.h>
#include <string.h>
int main()
    char dest[10] =  0 ;
    char src[10] =  "liangchen" ;
    strcpy(dest, src);
    puts(dest);
    return 0;

//输出:liangchen

  

以上是关于c语言strcpy将一个结构体的数据复制到另一个后,出问题了的主要内容,如果未能解决你的问题,请参考以下文章

c语言如何实现结构体的深度复制

C语言--strcpy()函数

c语言中的strcpy啥意思,简单点解释

c语言中的strcpy是啥意思?

C语言,将一个字符串中的元音字母复制到另一个字符串,然后按照ASCII码从小到大的顺序输出。

Golang复制结构体