Только первый символ строки будет напечатан в C - PullRequest
2 голосов
/ 10 мая 2011

У меня есть эта структура

typedef struct grade
{
    char firstName[SIZE];
    char lastName[SIZE];
    int stuNum;
}GRADE;

и этот выходной код:

void printData(GRADE grade[], int used)
{
    int i;
    for(i=0; i<used-1; i++)
    {
        printf("%s %s %d\n", grade[i].firstName, grade[i].lastName, grade[i].stuNum);
    }
}

Когда я пытаюсь распечатать символы, они печатают только первый символ строки, ястоит на месте и не может понять, как заставить печатать оставшуюся часть строки.

Этот код считывает файл данных (который находится в формате "Firstname Lastname StudentNumber" примерно в 17 строках, например "Mark Markinson 1234" newline "blah blah 1234" и т. Д.)

void readData(FILE *infile, GRADE grade[], int *count)
{
    char buf[SIZE] = {0};
    int position=*count;
    int used = 0;
    while( fgets(buf, SIZE, infile))
    { 
        removeNL(buf);

        grade[position].firstName[0] = parseName(buf, &used);
        used++;

        grade[position].lastName[0] = parseName(buf, &used);
        used++;

        grade[position].stuNum = parseNumber(buf, &used);
        used = 0;
        position++;
    }
    *count = position;

}

Это код, который анализирует буфер на наличие имен:

char parseName(char *str, int *place)
{
    char buf[SIZE] = {0}, name;
    int i=*place,j=0;

    while( str[i] != '\0' && !isspace(str[i]))
    {
        buf[j++] = str[i++];

    }
    buf[j] = '\0';

    *place = i;

    return *buf;
}

после получения некоторых предложений здесь я изменил некоторые изкод, но он все еще делает то же самое (печатается только первый символ)

использовал этот способ для вызова функции

parseName(buf, &used, grade[position].firstName);

и parseName теперь

void parseName(char *str, int *place, char *firstName)
{
    char buf[SIZE] = {0}, name;
    int i=*place,j=0;    
    while( str[i] != '\0' && !isspace(str[i]))
    {
        buf[j++] = str[i++];

    }
    buf[j] = '\0';

    *place = i;

    *firstName = *buf;
}

Ответы [ 3 ]

2 голосов
/ 10 мая 2011

return *buf возвращает (просто) первый символ в буфере, который является всем, что вы храните в массивах firstName и lastName.Проблема в том, что массивы не являются первоклассными типами в C, поэтому вы не можете передавать их в качестве аргументов функциям или возвращать их в качестве возвращаемых значений.

Что вы, вероятно, хотите сделать, это передать указатель набуфер для заполнения до parseName и должен заполнять его вместо использования локального буфера.Затем вы просто передаете firstName или lastName напрямую, которые становятся указателями на начало этих полей.

1 голос
/ 10 мая 2011

Проблема здесь:

void readData(FILE *infile, GRADE grade[], int *count)
{
    char buf[SIZE] = {0};
    int position=*count;
    int used = 0;
    while( fgets(buf, SIZE, infile))
    { 
        removeNL(buf);

        grade[position].firstName[0] = parseName(buf, &used);
        used++;

        grade[position].lastName[0] = parseName(buf, &used);
        used++;

        grade[position].stuNum = parseNumber(buf, &used);
        used = 0;
        position++;
    }
    *count = position;

}

Когда вы вызываете parseName, вы просто устанавливаете первые символы.Вы должны передать свой массив (где вы напишите строку) в parseName:

void readData(FILE *infile, GRADE grade[], int *count)
{
    char buf[SIZE] = {0};
    int position=*count;
    int used = 0;
    while( fgets(buf, SIZE, infile))
    { 
        removeNL(buf);

        parseName(buf, &used, grade[position].firstName);
        used++;

        parseName(buf, &used, grade[position].lastName);
        used++;

        grade[position].stuNum = parseNumber(buf, &used);
        used = 0;
        position++;
    }
    *count = position;

}

Не забудьте изменить parseName, добавив параметр и записав в него результат.

1 голос
/ 10 мая 2011

В parseName вы помещаете все входные данные в буфер и возвращаете первый символ, затем присваиваете этот символ firstName[0] или lastName[0] и никогда ничего не делаете с остальными данными, которые вы помещаете вбуфер.Неудивительно, что печатается только один символ.

Вероятно, вам следует изменить

grade[position].firstName[0] = parseName(buf, &used);

на

parseName(grade[position].firstName, &used);

На самом деле нет никаких причин возвращать первый символ вparseName.Вы можете изменить тип возвращаемого значения parseName на char* и вернуть buf вместо *buf для небольшой избыточности (некоторые функции C делают это), и это было бы лучше.

...