Структуры в C - не печатать всю строку - PullRequest
0 голосов
/ 04 марта 2012

Работая над самообучением в понимании структур на 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 ]

5 голосов
/ 04 марта 2012

name и city являются только одиночными символами: они не являются строками.

scanf("%s",&(ptr->name)); недопустимо и будет перезаписывать память при попытке прочитать строку в один char.

printf("%s", &name); ожидает, что name будет строкой с нулевым символом в конце, поэтому он будет печатать name char, а затем случайные символы, пока в памяти не будет найден ноль.

Измените на:

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() операторы для:

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

и screen_print() подпись для:

void screen_print(char* name,char* city,int wins,int losses,int draws)
1 голос
/ 04 марта 2012

В вашей структуре только один символ выделен для имени и города.Чтобы содержать строку, вам нужно указать длину в объявлении.

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

Строка в C довольно сложна.Это массив символов, использующий невидимое '\ 0' для окончания.Строка «привет» на самом деле в памяти означает «h», «e», «l», «l», «o», «\ 0».

1 голос
/ 04 марта 2012

Вы используете одиночные символы вместо массивов символов. Как при вводе, так и при выводе, система получает адрес памяти символа, думая, что это строка, и записывает в нее / читает из нее без какой-либо проверки границ. Таким образом, к соседней памяти также обращаются, даже если вы не собирались.

Вам повезло, что ваши числовые данные вводятся после текстовых, иначе даже они будут неверными. Поскольку структура обычно занимает смежные позиции в памяти, вероятно, они перезаписываются при вводе строк. Этот «мусор», который вы видите, на самом деле представляет собой данные в остальной части вашей структуры, а также все, что «близко» к нему в памяти, пока не будет найдено пустое значение (\0, интерпретируемое как нулевой символ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...