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

时间:2012-03-04 08:27:19

标签: c data-structures

在理解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));
}

3 个答案:

答案 0 :(得分:5)

namecity仅为单个字符:它们不是字符串。

scanf("%s",&(ptr->name));无效,将覆盖内存,因为正在尝试将字符串读入单个char

printf("%s", &name);期望name是一个以空字符结尾的字符串,因此它将打印name char然后随机字符,直到在内存中的某处找到null。

更改为:

struct stats {
    char name[20]; /* Or greater than 20 if required */
    char city[20];
    int wins;
    int losses;
    int draws;
};

或在填充之前动态分配内存,如果事先知道namecity的最大可能长度。

printf()语句更改为:

printf("Name:\t\t\t%s\n", name);
printf("City:\t\t\t%s\n", city);

scanf()语句:

scanf("%s",ptr->name);
scanf("%s",ptr->city);

screen_print()签名:

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

在您的结构中,只为名称和城市分配一个字符。要保存字符串,您需要在声明时指定长度。

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

C中的字符串非常棘手。它是一个字符数组,使用不可见的'\ 0'作为结尾。字符串“hello”实际上是内存中的“h”,“e”,“l”,“l”,“o”,“\ 0”。