この形式で文字列をスキャンできることを望んでいました
"hello world !!!!"
に
{"hello world", "!!!!"}
この 2 つの文字列は複数のスペースで区切られています。これを解析するか、少なくとも scanf で 2 つの連続するスペースを検出できますか?
この形式で文字列をスキャンできることを望んでいました
"hello world !!!!"
に
{"hello world", "!!!!"}
この 2 つの文字列は複数のスペースで区切られています。これを解析するか、少なくとも scanf で 2 つの連続するスペースを検出できますか?
このコードはあなたを助けることができます
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char a_buf[5][100] = {0}, sep[3] ,*buf = a_buf[0];
int i = 0;
buf = a_buf[0];
while (scanf("%s%2[ ]",buf,sep) > 1) {
if (strlen(sep)==1)
{
buf += strlen(buf);
*buf++ = ' ';
}
else
buf = a_buf[++i];
}
}
あなたの質問から、複数のスペースがあるという事実には興味がないようですが、それらを解析する方法だけに興味があるようです。
恐れるな!単一のスペース文字は、すでにすべての空白を*scanf
無視します ( "C" ロケールの、、およびを含む)。したがって、最も単純な形式では、次のように読むことができます。'\n'
'\r'
'\t'
'\v'
scanf("%s %s", str1, str2);
もちろん、エラーチェックは必要です。安全な方法の1つは次のとおりです。
char str1[100];
char str2[100];
scanf("%99s", str1);
ungetc('x', stdin);
scanf("%*s");
scanf("%99s", str2);
ungetc('x', stdin);
scanf("%*s");
これは一般的に安全な方法です(特定の質問とは関係ありません)。
ungetc
+は、文字列のscanf("%*s")
残りを無視します (存在する場合)。はすでにすべての空白を無視しているscanf("%99s")
ため、2 番目の前にスペースは必要ないことに注意してください(実際にはandを除くすべての前)。scanf
%s
%*
%c
%[
少なくとも 2 つのスペースがあることを本当に確認したい場合、および を使用することを主張する場合はscanf
、次のようにすることができます。
char str1[100];
char str2[100];
char c;
scanf("%99s", str1);
ungetc('x', stdin);
scanf("%*s");
scanf("%c", &c);
if (c != ' ')
goto exit_not_two_spaces;
scanf("%c", &c);
if (c != ' ')
goto exit_not_two_spaces;
scanf("%99s", str2);
ungetc('x', stdin);
scanf("%*s");
return /* success */
exit_not_two_spaces:
ungetc(c, stdin);
return /* fail */
C++ リファレンスによると ( http://www.cplusplus.com/reference/cstdio/scanf/ )
この関数は、次の非空白文字の前にある空白文字を読み取って無視します (空白文字には、スペース、改行、およびタブ文字が含まれます。isspace を参照してください)。フォーマット文字列内の単一の空白は、ストリームから抽出された任意の数の空白文字 (ゼロを含む) を検証します。
gets: http://www.cplusplus.com/reference/cstdio/gets/を使用して、返された文字列を解析する必要があると思います。
編集。gets() ではなく fgets() を使用する