2016-12-24 7 views
0

Вы можете мне помочь? У меня проблема с char* station; , когда я заполняю пробелы, все в порядке, но когда я с printf("%d)Input its stations: ",i+1);. Это проблема, я имею в виду: я вхожу в chech-joch-chor-dsh-dsh, но мне нужно ввести chech joch chor dsh dsh (это имена станций, это пример). Так оно печатает ТОЛЬКО ПЕРВОЕ СЛОВО, я не знаю почему .. проверьте это, пожалуйста ... (я понимаю, что мне нужно освободить то, что я сделал). Пожалуйста, объясните, почему это так, почему первый .. дать мне подсказку ..Строение и массив символов

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



typedef struct info_bus_{ 
    int number; 
    int begin; 
    int end; 
    char* stations; 
    int time_working; 
}info_bus; 


int main() 
{ 

    info_bus *b=NULL; 
    int i,n; 
    char buffer[128]; 
    printf("How many buses u have: "); 
    scanf("%d",&n); 

    b=(info_bus *)malloc(n*sizeof(info_bus)); 

    for(i=0;i<n;i++){ 
    printf("Input the number of a bus: "); 
    scanf("%d",&(b+i)->number); 

    printf("%d)Input when it starts to work: ",i+1); 
    scanf("%d",&(b+i)->begin); 

    printf("%d)Input when it finishes to work: ",i+1); 
    scanf("%d",&(b+i)->end); 

     printf("%d)Input its stations: ",i+1); 
     scanf("%127s", buffer); 
     b[i].stations = (char*) malloc(strlen(buffer) + 1); 
     strcpy(b[i].stations, buffer); 

    printf("Input time working: "); 
    scanf("%d",&(b+i)->time_working); 
    } 
    for (i=0;i<n;i++){ 
     printf("\n[%d].the number of a bus: %d",i+1,b->number); 
     printf("\n[%d]. Begin at: %d",i+1,b->begin); 
     printf("\n[%d]. Finishes at: %d",i+1,b->end); 
     printf("\n[%d]. Stations: %s",i+1,b->stations); 
     printf("\n[%d]. Time working: %d",i+1,b->time_working); 
     printf("\n"); 
    } 

    return 0; 
} 

но когда я использую gets() это: enter image description here

+0

'% s'' scanf' читается как разделитель в пространстве. Поэтому он не содержит пробелов в содержимом. – BLUEPIXY

+0

@ BLUEPIXY как это исправить? –

+0

См. Также [Почему функция get настолько опасна, что ее нельзя использовать?] (Http://stackoverflow.com/questions/1694036/why-is-the-gets-function-so-dangerous-that-it- должен быть не использован) – e0k

ответ

0
scanf("%127s", buffer); 

прекращает чтение после столкновения с новая линия. Если вы хотите, чтобы быть в состоянии прочитать несколько слов, то используйте fgets():

fgets(buffer, sizeof buffer, stdin); 

Примечание: fgets() также будет читать символ новой строки, если есть место. Вы можете удалить его, если необходимо:

buffer[strcspn(buffer, "\n")] = 0; /* to remove the newline */ 

Как правило, избегать использования scanf() даже для других входов. Это склонность к ошибкам. См.: Why does everyone say not to use scanf? What should I use instead?

Кроме того, отличное от malloc() является излишним. См.: What's wrong with casting malloc's return value?

+0

Не используйте 'gets()'. Вместо этого используйте 'fgets()'. Причиной вашей проблемы является 'fgets()' перестанет читать ввод после новой строки. Но предыдущий 'scanf()' оставляет новую строку. Вот почему вы не должны смешивать 'fgets()' и 'scanf()'. – usr

+0

, пожалуйста, посмотрите мой вопрос, я его обманул. когда я использую 'gets()'. мне приходит это –

+0

'' Ввод, когда он заканчивает работать: «' и '» Ввод его станций: «' в той же строке –