结构体中变量输入顺序不对会导致执行结果不对

写了一个程序,需求是:建立由3个学生数据结点构成的单向动态链表,向每个结点输入学生的数据

(每个学生的数据包括学号、姓名、成绩),然后逐个输出各结点中的数据。

正确的程序如下:

#include<stdio.h>

#include<malloc.h>

#define LEN sizeof(struct student)

struct student

{

int num;

char name[20];

float score;

struct student *next;

} ;

void main()

{

struct student *head,*p,*q;

head=p=(struct student*) malloc(LEN);

scanf("%d,%f,%s",&p->num,&p->score,p->name);

p=(struct student*) malloc(LEN);

scanf("%d,%f,%s",&p->num,&p->score,p->name);

q=(struct student*) malloc(LEN);

scanf("%d,%f,%s",&q->num,&q->score,q->name);

head->next=p;

p->next=q;

q->next=NULL;

p=head;

printf("\n结点 1:%d,%5.1f,%s",p->num,p->score,p->name);

p=p->next;

printf("\n结点 2:%d,%5.1f,%s",p->num,p->score,p->name);

q=p->next;

printf("\n结点 3:%d,%5.1f,%s\n",q->num,q->score,q->name);

}

运行结果为:

输入:

10101,98,li

10102,87,wang

10103,76,qi

输出:

结点 1:10101, 98.0,li

结点 2:10102, 87.0,wang

结点 3:10103, 76.0,qi

错误的程序如下:

#include<stdio.h>

#include<malloc.h>

#define LEN sizeof(struct student)

struct student

{

int num;

char name[2];

float score;

struct student *next;

} ;

void main()

{

struct student *head,*p,*q;

head=p=(struct student*) malloc(LEN);

scanf("%d,%s,%f",&p->num,p->name,&p->score);

p=(struct student*) malloc(LEN);

scanf("%d,%s,%f",&p->num,p->name,&p->score);

q=(struct student*) malloc(LEN);

scanf("%d,%s,%f",&q->num,q->name,&p->score);

head->next=p;

p->next=q;

q->next=NULL;

p=head;

printf("\n结点 1:%d,%5.1f,%s",p->num,p->score,p->name);

p=p->next;

printf("\n结点 2:%d,%5.1f,%s",p->num,p->score,p->name);

q=p->next;

printf("\n结点 3:%d,%5.1f,%s\n",q->num,q->score,q->name);

}

运行结果为:

输入:

10101,wang,,98

10102,wani,,87

10103,wangx,,76

输出:

结点 1:10101,  0.0,wang,,98 p?

结点 2:10102,  0.0,wani,,878p?

结点 3:10103,  0.0,wangx,,7

想要得到的结果应该为:

结点 1:10101,  98.0,wang,

结点 2:10102,  87.0,wani,

结点 3:10103,  76.0,wangx,

如果将想要输入的字符串数组放在输入的中间,就极有可能导致

在输入完字符串之后,还会将接下来输入的内容输入到字符串中,

会导致输出值发生混乱,得不到想要的结果,因而,最好将字符串

输入参数放在参数列表的最后,这样就可以避免输出产生错误。

时间: 2024-10-12 17:18:25

结构体中变量输入顺序不对会导致执行结果不对的相关文章

C++结构体中sizeof

说明: 结构体的sizeof值,并不是简单的将其中各元素所占字节相加,而是要考虑到存储空间的字节对齐问题.这些问题在平时编程的时候也确实不怎么用到,但在一些笔试面试题目中出是常常出现,一.解释 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐. 各个硬件平台对存储空间的处理上有很大的不同.一些平

结构体中的数据对齐

c语言结构中需要注意的就是数据存储的对齐方式. 对齐的好处:对齐主要是为了方便数据的访问,提高计算机的处理速度,但同时它会浪费内存空间. CPU的优化规则大致是这样的:对于n字节的元素,它的首地址能被n整除,才能获得最好的性能. 对齐的使用原则: 1.一般的基本对齐原则是按着最大的基本类型的长度进行对齐.较小的元素可以组合起来填充一段内存,实现基本的对齐.前提是其满足条件2. 2.结构体中的元素也要满足一定的分布条件,就是元素的存储起始地址要满足能够整除该元素类型的长度. 3.在结构体中存在结构

libev 中 ev_loop 结构体中的成员变量

1.ev_loop是libev用来描述事件循环的结构体.在libev中的定义比较绕,这里把它摘抄出来,做下注释,方便学习.libev的定义如下 struct ev_loop { ev_tstamp ev_rt_now; #define ev_rt_now ((loop)->ev_rt_now) #define VAR(name,decl) decl; #include "ev_vars.h" #undef VAR }; #include "ev_wrap.h"

遍历结构体中的变量

public struct Site  {  [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 30)]  public string Country;     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]  public string StationNumber;     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]  publi

C++结构体中sizeof(1)

sizeof sizeof操作符的作用是返回一个对象或类型名的长度,长度的单位是字节. 返回值的类型是标准库命名为size_t的类型,size_t类型定义在cstddef头文件中,该头文件是C标准库的头文件stddef.h的C++版本.他是一个和机器相关的unsigned类型,其大小足以保证内存中对象的大小. 1.什么是sizeof 首先看一下sizeof在msdn上的定义: The sizeof keyword gives the amount of storage, in bytes, as

结构体共用变量 递归

结构体共用变量 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 结构体复习共用变量 { class Program { public int renfen; public int dianfen; public int caiquan() { Console.Write("你要出的是(剪刀石头布

C结构体中数据的内存对齐问题

转自:http://www.cnblogs.com/qwcbeyond/archive/2012/05/08/2490897.html 32位机一般默认4字节对齐(32位机机器字长4字节),64位机一般默认8字节对齐(64位机机器字长8字节) 1.先看下面的例子:struct A{   char c1;   int i;   short s;   int j;}a; struct B{   int i;   int j;     short s;   char c1;}b; 结构A没有遵守字节对

结构体中指针赋值问题的分析及C代码示例

问题描述 某结构体的定义如下: typedef struct { int iAge; // 年龄 char szAddr1[100]; // 地址1 char *pszAddr2; // 地址2 char **pszAddr3; // 地址3 } T_PeopleInfo; 请问如何对结构体中的各个成员变量(尤其是指针变量)进行赋值? 问题分析及C代码示例 我们可以看到,在结构体T_PeopleInfo中,pszAddr2和pszAddr3均为指针,其中pszAddr2为一级指针,pszAddr

c语言 struct结构体的变量声明加冒号

有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1两种状态,用一位二进位即可. 为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为"位域"或"位段".所谓"位域"是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数.每个域有一个域名,允许在程序中按域名进行操作.这样就可以把几个不同的对象用一个字节的二进制位域来表示. [1]定义: struct 位域结构名 { 位