2016-03-31 10 views
1

fgetsstrcatを使用しているときに問題が発生しました(をscanfに置き換えようとしましたがプログラムが正常に動作しました)。 strcatが機能していないようです。fgetsとstrcatの使用時の問題

char name[256]; 
char text[256]; 

fgets(name,250,stdin); 
strcat(name,".txt"); 
printf("%s\n",name); 

出力は、(別々の行に)ある:

d 
.txt 
+1

'fgets'の後に新しい行をnameから削除する必要があります。 –

+0

[別の質問への私の答え](http://stackoverflow.com/a/36341266/434551)を見てください。質問は異なりますが、ソリューションはまったく同じです。 –

+0

'strcat'が機能しなかった場合、出力に' .txt'が表示されません –

答えて

2

あなたが入力から改行を削除しなければなりません。このように:

fgets(name, 250, stdin); 
char *p = strchr(name, '\n'); 
if (p) 
    *p = '\0'; 
strcat(name, ".txt"); 

明らかに、いくつかのエラーチェックを追加したいと思いますが、これはアイデアを示しています。

+1

これは改行が 'name'にあると仮定しています。おそらく 'strchr'を使用します。 –

+0

@FiddlingBits良い点。編集されました。 –

1

fgets機能でも'\n'が消費されるため、そのように表示されます。あなたは簡単にするために代わりにscanfを使用することができます。

int main() { 
    char name[256]; 
    char text[256]; 

    scanf("%250s",name); 
    strcat(name,".txt"); 
    printf("%s\n",name); 
} 
+0

注: 'scanf("%s ")'は次のスペースまで読み込みます。http://stackoverflow.com/questions/1247989/how-do-you-allow-spaces-to-be-entered-using-詳細についてはscanfを参照してください。 –

+0

@RolandIlligそうですが、例ではファイル名 "d.txt"のように表示されているため、スペースをキャッチすることはできず、最後の "\ n"を削除するための余分な機能は必要ありません。しかし、コードの意図が本当にスペース、タブを含む穴の文字列を取得するためのものであれば...あなたは正しい – Pooya

1

めったに使われない機能strcspnを使用して、これは簡単で、エラーが発生しやすい次のようになります。

if (fgets(name, 250, stdin) != NULL) { 
    strcpy(name + strcspn(name, "\n"), ".txt"); 
    ... 
} 

strcspn機能がない文字の数をカウント\n; strcspnのcはを補完してを意味します。 したがって、名前に改行が含まれているかどうかにかかわらず、.txtは常に正しい位置に追加されます。

関連する問題