2016-12-24 30 views
0

あなたは私を助けることができますか? char* station; 私は私のギャップを埋めるときに、everithingは問題ないですが、私が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

'scanf'の'%s'は、空白スペースのセパレータとして読み取ります。したがって、内容にはスペースは含まれません。 – 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

お願いします、私の質問を見て、私はそれをchagedしました。私が 'gets()'を使用するとき。それは私に起こる –

+0

''仕事が終わったら入力: ''と ''その駅を入力してください: "'同じ行 –