Скопируйте строку в массив символов - PullRequest
0 голосов
/ 18 декабря 2010

Здравствуйте, я хочу скопировать ввод пользователя в массив char, который определен в структуре. С уважением, я понятия не имею, как это сделать.

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


int main ()

{
    struct employee
    {
        char firstname[11];
        char lastname[11];
        char number[11];
        int salary;
    }

    int i;
    int nemps;
    const int maxemps = 5;
    struct employee* emps[maxemps];

    printf("How many employees do you want to store?(max:5): ");
    scanf("%d", nemps);

    for (i = 0; i < nemps; i++)
    {
        printf("Employee 1./nLast name:");
        scanf("....")// Read the string and copy it into char lastname[]
    }

}

Ответы [ 2 ]

3 голосов
/ 18 декабря 2010

Сначала struct employee* emps[maxemps]; создает массив из указателей для структурирования employee с размером массива maxemps .Вы на самом деле не выделяете в памяти места для фактических структур, а только указатели, которые будут на них указывать.Чтобы динамически распределять пространство в куче для ваших структур, чтобы вы могли использовать их осмысленно, вам нужно выполнить цикл по вызову malloc(), например, так:

for (i = 0; i < maxemps; i++) {
   emps[i] = malloc(sizeof(struct employee));
}

Вы также захотитеаналогичный цикл в конце вашей программы, который будет free() каждый указатель.

Далее, когда вы получаете ввод от пользователя, вы действительно хотите использовать fgets() вместо scanf(), потому что fgets()позволяет указать количество символов для чтения, чтобы предотвратить переполнение буфера назначения.

Обновление

Если вы хотите работать с одним struct employee без использования указателейэто достигается путем объявления одного или нескольких struct employee в стеке и последующего использования оператора доступа к элементу . следующим образом:

struct employee emp;
fgets(emp.lastname, sizeof(emp.lastname), stdin);

Update2

Я обнаружил ряд ошибок вваш код.Пожалуйста, смотрите эту ссылку для рабочего образца с комментариями.

2 голосов
/ 18 декабря 2010

Вам нужно только:

scanf("%10s", (emps[i])->last_name);

Здесь "%10s" обозначает строку с максимальной длиной 10 и загружает строку в last_name.

В Си строка представлена ​​как массив символов, с '\0' в качестве конца.

Использование scanf здесь уязвимо для буферных атак, если пользовательский ввод длиннее 10: http://en.wikipedia.org/wiki/Scanf#Security,, поэтому вам необходимо назначить максимальную длину для формата.

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