0

この形式で文字列をスキャンできることを望んでいました

"hello world        !!!!"

{"hello world", "!!!!"}

この 2 つの文字列は複数のスペースで区切られています。これを解析するか、少なくとも scanf で 2 つの連続するスペースを検出できますか?

4

3 に答える 3

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];
    }
}
于 2013-01-15T13:49:47.363 に答える
2

あなたの質問から、複数のスペースがあるという事実には興味がないようですが、それらを解析する方法だけに興味があるようです。

恐れるな!単一のスペース文字は、すでにすべての空白を*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 */
于 2013-01-15T09:37:29.173 に答える
-1

C++ リファレンスによると ( http://www.cplusplus.com/reference/cstdio/scanf/ )

この関数は、次の非空白文字の前にある空白文字を読み取って無視します (空白文字には、スペース、改行、およびタブ文字が含まれます。isspace を参照してください)。フォーマット文字列内の単一の空白は、ストリームから抽出された任意の数の空白文字 (ゼロを含む) を検証します。

gets: http://www.cplusplus.com/reference/cstdio/gets/を使用して、返された文字列を解析する必要があると思います。

編集。gets() ではなく fgets() を使用する

于 2013-01-15T09:29:59.843 に答える