2016-05-20 2 views
-1

Моя основная проблема заключается в том, что при печати из элемента struct s s.name печатается дважды.Printf выводит один и тот же массив дважды

Код:

#include <stdio.h> 

struct Item{ 
    char code[5]; 
    char name[40]; 
}; 

int main(){ 
    FILE *f; 
    struct Item s; 

    //Open file 
    f = fopen("ex.txt", "r"); 

    //Read from file 
    fscanf(f, "%5c;%[a-zA-Z ]\n", s.code, s.name); 

    //Print from file 
    printf("%s %s", s.code, s.name); //Main problem here 
    fclose(f); 
} 

ввода (ex.txt):

AB011;Hello World 

Вывод должен быть:

AB011 Hello World 

Но вместо того, чтобы это:

AB011Hello World Hello World 

Что здесь происходит?

Дополнительные примечания: Мне нужно использовать fscanf для этого, чтобы я мог узнать, как это работает.

+0

что gst_file? Разве вы не читали из файла, который вы открыли? –

+0

'% s': аргумент нужен null-terminator. – BLUEPIXY

+1

@JewelThief Да, извините. Просто поправил его. – Steve

ответ

3

В вызове fscanf вы используете

"%5c;%[a-zA-Z ]\n" 

в качестве формата. Часть спецификатора формата %5c считывает 5 символов по номеру s.code. Это не оставляет места для завершающего нулевого символа.

Использование этого аргумента в printf с %s указывает на неопределенное поведение. %s нужна строка с нулевым завершением.

Вы должны изменить размер code, чтобы использовать 6 символов, а затем прервать его нулевым символом после линии fscanf.

#include <stdio.h> 

struct Item{ 

    /// CHANGED HERE 
    char code[6]; 
    char name[40]; 
}; 

int main(){ 
    FILE *f; 
    struct Item s; 

    //Open file 
    f = fopen("ex.txt", "r"); 

    //Read from file 
    fscanf(f, "%5c;%[a-zA-Z ]\n", s.code, s.name); 

    /// CHANGED HERE 
    s.code[5] = '\0'; 

    //Print from file 
    printf("%s %s", s.code, s.name); 
    fclose(f); 
} 
+0

Итак, главная проблема в том, что мне нужно дополнительное пространство в конце, чтобы обозначить нулевой символ? – Steve

+1

@Steve, это правильно. –

+0

@R Sahu Хорошо, теперь я получаю. Спасибо за вашу помощь – Steve

2
  1. При хранении 5 символов в code размер должен быть шесть байтов, в том числе \0 терминатора.

  2. Для scanf %[5]c - считывает ровно 5 символов и не добавляет завершающий код \0.

Если ширина, отличная от 1 указана, то функция читает точно по ширине символов и сохраняют их в последовательных точках массива, переданный в качестве аргумента. В конце не добавляется нулевой символ.

Что вам нужно сделать, это добавить \0 сами в конце

//Read from file 
fscanf(f, "%5c;%[a-zA-Z ]\n", s.code, s.name); 
s.code[5] = '\0'; 
Смежные вопросы