Борьба с печатью значений из структур в C - PullRequest
0 голосов
/ 01 марта 2012

У меня небольшие проблемы со структурами в C. Я думаю, что проблема с указателями.Вот что должна делать моя программа;Прочитайте входные данные, такие как эта;

Name: Hello
Gender: Male
Age: 60

Name: Hello1
Gender: Male
Age: 13

Name: Hello2
Gender: Female
Age: 10

Name: Hello3
Gender: Male
Age: 20

Я хочу, чтобы программа прочитала слова после ':', например, Hello, и поместила это значение в структуру.Таким образом, индекс [1] структуры должен содержать привет, мужчина, 60, например.

Когда я печатаю значения внутри цикла while, он печатается нормально.Но когда я пытаюсь напечатать значения структур вне цикла while, это не работает.Я получаю это как вывод;

¿6Q ¿6Q  60
 ↑  13
 æ £  10
 §☺  ☺  20

Это печать возраста для каждого элемента, но не для всех остальных.Я боролся с этим некоторое время, и понятия не имею, почему это так.Спасибо за помощь;Вот мой код:

1 Ответ

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

Прежде всего, пожалуйста, отметьте домашнее задание как домашнее задание.

Во-вторых, как указал мистер Листер, вы выделяете переменную line длиной 80 символов, но вы читаете в нее до 100 символов из файла - с длинными строками это может вызвать проблемы. Вы должны прочитать не более 79 символов (оставляя 1 для \0 в конце).

Теперь по поводу "печати", я думаю, что ваша проблема в следующих строках:

p[nameIndex].name = (char*)malloc(sizeof(line));
p[nameIndex].gender = (char*)malloc(sizeof(line));
p[nameIndex].age = (char*)malloc(sizeof(line));

Поскольку line по сути является char *, sizeof(line) не даст вам ожидаемых результатов. Вместо этого вы должны использовать функцию strlen - и не здесь, а в том месте, где вы копируете данные. Ваш код должен выглядеть примерно так:

switch(i)
{
    case 1:
        p[nameIndex].name = (char*)malloc(strlen(tmp) + 1);
        strcpy(p[nameIndex].name, temp);
        break;
    case 2:
        p[nameIndex].gender = (char*)malloc(strlen(tmp) + 1);
        strcpy(p[nameIndex].gender, temp);
        break;
    case 3:
        p[nameIndex].age = (char*)malloc(strlen(tmp) + 1);
        strcpy(p[nameIndex].age, temp);
        break;
    default:
        break;
}

Конечно, это предполагает, что каждый символ занимает 1 байт памяти. В противном случае вы должны использовать (strlen(tmp) + 1) * sizeof(char), чтобы получить правильное распределение.

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