scanf("%s",str) はそれを行いません。最初のスペースで読み取りを停止します。gets(str) は、文字列が大きい場合にも機能しません。何か案は?
5 に答える
ファイルストリームとして STDIN でfgetsを使用します。次に、読み取りたいデータの量とそれを配置する場所を指定できます。
char str[100];
これを試して
scanf("%[^\n]s",str);
またはこれ
fgets(str, sizeof str, stdin))
行を読み取る独自の関数を作成します。基本的にあなたがしなければならないことは次のとおりです。
1. 割り当てられた (拡張可能な) メモリへの fgets 2. それがフルラインだった場合は完了です 3.配列を拡張する 4. 新たに割り当てられたメモリに fgets により多くの文字が格納されます 5. 2 に進みます。
実装は少しトリッキーかもしれません:-)
関数に何を渡す必要があるかを考える必要があります (少なくとも配列のアドレスとそのサイズ)。そして、すべてが「機能」したとき、またはエラーが発生したときに関数が返すもの。何がエラーかを判断する必要があります ('\n' のない 10G バイトの文字列はエラーですか?)。配列を拡張する方法を決定する必要があります。
編集
fgetc
実際には、むしろした方が良いかもしれませんfgets
キャラクターを取得する それはEOFですか?終わり 配列への追加 (長さの更新)、可能性のある配列の拡張 (サイズの更新) '\n' ですか? 終わり 繰り返す
スペースを含む文字列を読み取るには、次のようにします。
char name[30],ch;
i=1;
while((ch=getchar())!='\n')
{
name[i]=ch;
i++;
}
i++;
name[i]='\n';
printf("String is %s",name);
いつ読むのをやめたいですか?EOF で、特定の文字で、または何ですか?
%c で特定の文字数を読み取ることができます
c 幅カウント文字のシーケンスに一致します (デフォルトは 1)。次のポインターは char へのポインターである必要があり、すべての文字に十分なスペースが必要です (終端の NUL は追加されません)。先頭の空白の通常のスキップは抑制されます。最初に空白をスキップするには、フォーマットで明示的なスペースを使用します。
%[ で特定の文字 (または除外された文字まで) を読み取ることができます
[ 指定された受け入れられる文字セットからの空でない一連の文字に一致します。次のポインターは char へのポインターである必要があり、文字列内のすべての文字と終端の NUL 文字を格納できる十分なスペースが必要です。先頭の空白の通常のスキップは抑制されます。文字列は、特定のセットに含まれる (または含まれない) 文字で構成されます。セットは、開き括弧 [文字と閉じ括弧] 文字の間の文字によって定義されます。開き括弧の後の最初の文字がサーカムフレックス ^ である場合、セットはそれらの文字を除外します。セットに閉じ括弧を含めるには、開き括弧またはサーカムフレックスの後の最初の文字にします。他の位置はセットを終了します。ハイフン文字 - も特殊です。他の 2 つの文字の間に配置すると、間にあるすべての文字がセットに追加されます。ハイフンを含めるには、最後の閉じ括弧の前の最後の文字にします。たとえば、`[^]0-9-]' は、セット「右括弧、0 から 9、およびハイフンを除くすべて」を意味します。文字列は、セットにない (またはサーカムフレックスを使用して) 文字の出現で終了するか、フィールド幅がなくなると終了します。最後の閉じ括弧の前の最後の文字にします。たとえば、`[^]0-9-]' は、セット「右括弧、0 から 9、およびハイフンを除くすべて」を意味します。文字列は、セットにない (またはサーカムフレックスを使用して) 文字の出現で終了するか、フィールド幅がなくなると終了します。最後の閉じ括弧の前の最後の文字にします。たとえば、`[^]0-9-]' は、セット「右括弧、0 から 9、およびハイフンを除くすべて」を意味します。文字列は、セットにない (またはサーカムフレックスを使用して) 文字の出現で終了するか、フィールド幅がなくなると終了します。