2016-07-02 4 views
0

なぜ2番目のscanfが何の入力をしないのですか? %sは文字列をカタカナできますか?2つのscanf(%s)を同時に使用する際に何が間違っていますか

#include <stdio.h> 
#include <stdlib.h> 
#include<string.h> 
int main() 
{ 
char string1[50]; 
char string2[50]; 


scanf("%[^\n]s",string1); 
scanf("%[^\n]s",string2); 

printf("\nfirst string :%s \n",string1); 
printf("\nsecnd string :%s \n",string2); 

return 0; 
} 

入力:最初の文字列は:これはBBC 2番目の文字列である:{いくつかの文字記号}

答えて

1

問題はあなたscanfフォーマット文字列が必要とされていること、これはBBCは、[入力]

が出力されますsで終わる文字列:%[^\n]が書式指定子として解釈され、sが入力と一致する必要があります。 2番目の文字列はsで開始されないため、2番目のscanfは何も読み取られません。二scanf%[^\n]の前にスペースを入れて、さらに良い

scanf("%[^\n] ", string1); 
//   ^
// Space is important 

スペースでsを交換すると、問題を解決します

scanf("%49[^\n]", string1); 
scanf(" %49[^\n]", string2); 

をあなたの文字列バッファは容量が限られているので、 バッファオーバーランを避けるためには、49の制限が必要です。

+0

大丈夫ありがとうございました。gets()を使用することなく、適切な方法が必要です。 –

+0

これは、状況がscanf( "%s"、array1)で、次の行scanf( "%s"、array1)が同じ配列の場合です。出力 –

+1

@deepakpandey入力がバッファサイズを超えた場合、バッファオーバーランが発生します。サイズを明示的に制限する: 'scanf("%9s "、bufOfTen)'ヌルターミネータのために余分なバイトが必要です。 – dasblinkenlight

1

"%[^\n]s"scanfに改行ではないすべての文字を "食べ"て引数に入れます。これは、最初のscanfが返った後に、それが読み込みバッファで停止させた改行を残していることを意味します。次のscanfはそれを見つけ、すぐに読み込みを停止します。結局、最初の改行まで読み上げるように言いました!

ここに解決策は、それができる他のすべての空白を食べるようにscanfを伝えることで、スペースは「魔法」であっても、文字列、または"%[^\n]s "を、以下のさえ改行を「食べる」これは、"%[^\n]s\n"を使用することができこれは改行を含みます(ただし、次の行で空の文字列を読みたい場合はこれが悪い考えです)。

さらに簡単、あなたは単に%sscanfとは異なり、バッファオーバーフローに対して安全である、fgets(string1, sizeof(string1), stdin)を、(はい、あなたも%s安全に行うことができますが、それはより多くの仕事です)を使用することができます。 fgetsはあなたの文字列に末尾の改行文字を置きます。

+0

それが得られました.thanks :)これは、状況がscanf( "%s"、array1)で、次の行scanf( "%s"、array1)が同じ配列である場合、もう1つの探求です。入力は10を超えます出力は何でしょうか –

+0

@deepakpandey:プログラムがクラッシュすると部分的に破損する1つの文字列にうまく動作するように見えるものから何かが起こります。それをしないで、適切にバッファーをサイズし、常にバッファーのサイズを指定できる文字列入力関数を使用してください。 –

+0

貴重な情報をありがとう:) –

-1

あなたのコードは1つの入力のみを読みます。 %[^ \ n] sが 's'の読み込みに失敗する

2つのscanf()ステートメントを次のものに置き換えます。 私のシステム上でコードを実行するだけで動作します。

scanf( "%[^ \ n] s%[^ \ n] s"、string1、string2);

または、文を削除してスペースを追加してください。

scanf( "%[^ \ n]"、string1);
scanf( "%[^ \ n]"、string2);

文字列の入力を確認して、適切な出力を表示します。

関連する問題