C中的结构-不打印整个字符串

C中的结构-不打印整个字符串,c,data-structures,C,Data Structures,在理解C语言结构方面进行一些自学 我制作了一个小程序,从用户那里获取信息,然后通过函数将其打印回来。 在C Primer Plus一书中,我使用了两种不同的方法来传递数据 发生的情况是,我可以输入数据,但当它将数据打印出来时,数字数据是可以的,但每个字符串中只有第一个字符后面会打印垃圾 下面是我的代码以供审阅。我想不出问题出在哪里 任何帮助都会很好。谢谢 #include <stdio.h> #include <stdlib.h> struct stats { char

在理解C语言结构方面进行一些自学

我制作了一个小程序,从用户那里获取信息,然后通过函数将其打印回来。 在C Primer Plus一书中,我使用了两种不同的方法来传递数据

发生的情况是,我可以输入数据,但当它将数据打印出来时,数字数据是可以的,但每个字符串中只有第一个字符后面会打印垃圾

下面是我的代码以供审阅。我想不出问题出在哪里

任何帮助都会很好。谢谢

#include <stdio.h>
#include <stdlib.h>

struct stats {
char name;
char city;
int wins;
int losses;
int draws;
};

void screen_print(char name,char city,int wins,int losses,int draws);
void team_input (struct stats * ptr);

int main()
{
struct stats team;

team_input(&team);
screen_print(team.name,team.city,team.wins,team.losses,team.draws);

return 0;
}

void screen_print(char name,char city,int wins,int losses,int draws)
{
// system("cls");
printf("==================================================\n");
printf("Name:\t\t\t%s\n",&name);
printf("City:\t\t\t%s\n",&city);
printf("Number of Wins:\t\t%d\n",wins);
printf("Number of Losses:\t%d\n",losses);
printf("Number of Draws:\t%d\n",draws);
printf("==================================================");

}
void team_input (struct stats * ptr)
{
system("cls");

printf("Enter Team name: ");
scanf("%s",&(ptr->name));
printf("\nEnter City:");
scanf("%s",&(ptr->city));
printf("\nEnter Wins:");
scanf("%d",&(ptr->wins));
printf("\nEnter Losses:");
scanf("%d",&(ptr->losses));
printf("\nEnter Draws:");
scanf("%d",&(ptr->draws));
}
#包括
#包括
结构统计{
字符名;
查尔市;
int获胜;
整数损失;
整数绘制;
};
无效屏幕打印(字符名称、字符城市、整数赢、整数输、整数画);
无效团队输入(结构统计*ptr);
int main()
{
结构统计组;
团队输入(和团队);
屏幕打印(团队名称、团队城市、团队胜利、团队失败、团队平局);
返回0;
}
无效屏幕打印(字符名称、字符城市、整数赢、整数输、整数画)
{
//系统(“cls”);
printf(“================================================================\n”);
printf(“名称:\t\t\t%s\n”,&Name);
printf(“城市:\t\t\t%s\n”、&City);
printf(“获胜次数:\t\t%d\n”,Wins);
printf(“损失数量:\t%d\n”,损失);
printf(“绘图数量:\t%d\n”,绘图);
printf(“=====================================================================================”);
}
无效团队输入(结构统计*ptr)
{
系统(“cls”);
printf(“输入团队名称:”);
scanf(“%s”和(ptr->name));
printf(“\n输入城市:”);
scanf(“%s”和(ptr->city));
printf(“\n输入者获胜:”);
scanf(“%d”和(ptr->wins));
printf(“\n输入损失:”);
scanf(“%d”和(ptr->loss));
printf(“\n输入绘制:”);
scanf(“%d”和(ptr->draws));
}

name
city
仅为单个字符:它们不是字符串

scanf(“%s”和(ptr->name))
无效,当试图将字符串读入单个
字符时,它将覆盖内存

printf(“%s”、&name)
希望
名称
是以null结尾的字符串,因此它将打印
名称
字符
,然后是随机字符,直到在内存中的某个位置找到null为止

改为:

struct stats {
    char name[20]; /* Or greater than 20 if required */
    char city[20];
    int wins;
    int losses;
    int draws;
};
或者,如果事先未知
name
city
的最大可能长度,则在填充之前动态分配内存

printf()
语句更改为:

printf("Name:\t\t\t%s\n", name);
printf("City:\t\t\t%s\n", city);
scanf("%s",ptr->name);
scanf("%s",ptr->city);
scanf()
语句,以:

printf("Name:\t\t\t%s\n", name);
printf("City:\t\t\t%s\n", city);
scanf("%s",ptr->name);
scanf("%s",ptr->city);
屏幕打印()
签名至:

void screen_print(char* name,char* city,int wins,int losses,int draws)

您使用的是单个字符而不是字符数组。在输入和输出时,系统都会获取字符的内存地址,认为它是一个字符串,并在没有任何边界检查的情况下对其进行写入/读取。因此,相邻的内存也会被访问,即使您不打算这样做


幸运的是,您的数字数据是在文本数据之后输入的,否则即使这些数据也是错误的。由于结构通常会占用内存中连续的位置,所以在输入字符串时,它们很可能被覆盖。您看到的“垃圾”实际上是结构其余部分中的数据,加上内存中与它“接近”的任何内容,直到找到空值(
\0
,解释为空字符)。

在结构中,只有一个字符分配给name和city。要保存字符串,需要指定声明处的长度

struct stat {
  char city[20];
  char name[20];
...
}

C中的字符串相当棘手。它是一个字符数组,结尾使用不可见的“\0”。字符串“hello”在内存中实际上是“h”、“e”、“l”、“l”、“o”和“\0”。

谢谢!这就解决了问题。那么,为什么我需要澄清结构中的字符串长度而不是非结构化字符中的字符串长度呢?您确实需要指定字符串的大小,即使它不是
结构的一部分。您指的是
screen\u print()
的参数吗?Doh!我刚刚意识到,除了一个被操纵的数组之外,我从来没有使用过char。550页的阅读C Plus入门和代码示例,我一直使用int、float、double或char数组。我认为它只是自动调整到输入长度,除非受到scanf()参数的限制。现在觉得有点驼背。