关于结构体初始化的一个问题

结构体的初始化

开始自学编程,但是编程之路困难重重,于是我打算将学习之中遇到的问题以及解决方案贴在这里,方便以后复习。
在这里插入图片描述
那我今天总结了一下结构体初始化的几种方法.如下:

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

typedef struct student
{
	char name[20];
	int age;
}stu;

int main()
{
	stu s1 = {"小明",18};//定义的同时初始化
	
	stu s2;
	s2 = (stu){"小红",17};//先定义再初始化
	
	stu s3;
	strcpy(s3.name,"小李");// 
	s3.age = 19; 
	
	stu s4 = {.name = "大白",.age = 20};//指定数据进行赋值(1) 
	
	stu s5 = {name : "小黑",19};//指定数据进行赋值(2) 
	
	printf("%s %d\n",s1.name,s1.age); 
	printf("%s %d\n",s2.name,s2.age); 
	printf("%s %d\n",s3.name,s3.age); 
	printf("%s %d\n",s4.name,s4.age); 
	printf("%s %d\n",s5.name,s5.age); 
	
}

我们运行上面的代码就会出现下面的打印结果。

小明 18
小红 17
小李 19
大白 20
小黑 19

注意:
*(1)在初始化s2时,前面一定要加上结构体类型,否则会报错:[Error] expected expression before ‘{’ token意思就是在“{ 0 }”标记之前需要表达式。还有数组必须定义的时候初始化,而结构体却可以先定义再初始化。
(2)再初始化s3时,字符串赋值是要用到strcpy,而不可以直接 “=” 进行赋值,否则会出现[Error] assignment to expression with array type,意思是赋值给数组类型的表达式。
(3)再初始化s4时,一定要记得加上 ‘ . ’ *

但是呢?昨天一位群友却问了这样一个问题,可让我想了好一会。如下:

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

typedef struct student
{
	char name[20];
	int age;
}stu;

int main()
{
	char a[20];
	int b;
	printf("input:");
	gets(a);
	scanf("%d",&b);
	stu s1 = {a,b};
	printf("output:");
	puts(s1.name);
	printf("%d",s1.age);
	
}

大概看一下,他的意思很明确,就是想在初始化s1时,赋值一个变量,而这些变量是未知的是等待用户输入的,而这就让我不太明白了,一般情况下,我都会选择直接接收键盘输入进行赋值,就像这样

stu s1;
gets(s1.name);
scanf("%d",&s1.age);

当我用这个替换上面打代码时,就解决了问题,正常输出了

input:小明
34
output:小明
34

然后我又尝试运行了他的代码后,却不能正常输出了,如下:

input:小明
34
output:?
0

于是我便想为什么会出现这样的错误呢?
为了便于查看,我便将问题进行了简化。

#include<stdio.h>
#include <string.h>
int  main()
{
	char a[10];
	char b[10];
	gets(a);
	b = a;
	puts(b);
}

很显然这样是会出现错误的,错误为:[Error] assignment to expression with array type,意思是赋值给数组类型的表达式,一想便会明白,b便是这个数组的首地址了,而地址当然是不能随便更改的啦,然后我便想到了指针,于是:

#include<stdio.h>
#include <string.h>
int  main()
{
	char a[10];
	char *b;
	gets(a);
	b = a;
	puts(b);
}

结果便正常了。

于是根据这个道理,我便尝试,修改结构体的那个数组为指针,如下:

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

typedef struct student
{
	char *name;
	int age;
}stu;

int main()
{
	char a[20];
	int b;
	printf("input:");
	gets(a);
	scanf("%d",&b);
	stu s1 = {a,b};
	printf("output:");
	puts(s1.name);
	printf("%d",s1.age);
}

结果呢?便可以正常了!

input:小明
34
output:小明
34

但是如果用数组该怎么解决呢?
借用strcpy试试

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

typedef struct student
{
	char name[20];
	int age;
}stu;

int main()
{
	char a[20];
	int b;
	printf("input:");
	gets(a);
	scanf("%d",&b);
	stu s1;
	strcpy(s1.name,a);
	s1.age = b;
	printf("output:");
	puts(s1.name);
	printf("%d",s1.age);
}

结果呢?也是可以的!

input:小明
34
output:小明
34

我们刚才用的是第三种初始化的方法:先定义,再逐个初始化,那么我们如何定义的同时初始化呢?

于是我查看了strcpy的函数原型:

char *my_strcpy(char *dest,const char *src)    
{
  char *strDest = dest;                                  
  assert((dest!=NULL)&&(src!=NULL)); 
  while((*dest++=*src++)!='\0'); 
  return strDest;
}

我们发现strcpy是有返回值类型的,那我们借用第四种初始化的方法试一试呢?

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

typedef struct student
{
	char name[20];
	int age;
}stu;

int main()
{
	char a[20];
	int b;
	printf("input:");
	gets(a);
	scanf("%d",&b);
	stu s1={.name=strcpy(s1.name,a),.age = b};
	printf("output:");
	puts(s1.name);
	printf("%d",s1.age);
}

结果呢?却出现了不明字符。于是我便尝试了多次,结果每次输入时第一个字符总是不正确。

input:小明
23
output:悺明
23

这个问题困扰我了一天,还是没明白,如果有大佬明白原因的,希望可以在评论区回复我哦!

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 1024 设计师: 上身试试
应支付0元
点击重新获取
扫码支付

支付成功即可阅读