2

スペース+単語を含むテキストをCでのみスキャンすることは可能ですか?

サンプルテキストは次のとおりです。

"Oh my   god!"

関数は次のとおりです。

...declarations...malloc...etc.
for (int i = 0; ; i++)
{
    some_scanf_func(s, "%some format", input);
    c = getchar();
    if (c == EOF)
        break;
    else
        ungetc(c, stdin);
}

私の入力は次のとおりです。

"Oh" when i = 0;

" my" when i = 1;

"   god!" when i = 2;

スペースは単語の前にあります。句読点は有効な文字としてカウントされます。

トリックをしてくれた chux に感謝し、答えてくれた Charlie に感謝します。

4

3 に答える 3

2

別のアプローチは次のとおりです。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

int foo(char *s, char **result, int size) {
        char *p1 = s;
        int count = 0;
        while(*p1 && count < size-1) {
                char *p2 = p1;
                for( ; *p2 && isspace(*p2); p2++);
                if(*p2) {
                        for( ; *p2 && isspace(*p2) == 0; p2++);
                        result[count++] = strndup(p1, p2 - p1);
                }
                p1 = p2;
        }
        result[i] = 0;
        return count;
}

int main(void) {
        char *result[100];
        int n = foo("  Oh my   god! ", result, 100);
        for(int i = 0; i != n; i++) {
                printf("%d '%s'\n", i, result[i]);
                free(result[i]);
        }
        return 0;
}

ちょっと醜いと思います。しかし、それは印刷します

0 '  Oh'
1 ' my'
2 '   god!'

また、元の入力でも正しいことを行います。

于 2013-11-02T17:02:28.187 に答える
2

を使用し"%*s%n"ます。

%*s先頭の空白をスキップしてから、空白以外のテキストをスキャンします。結果は*言わないと言う。

%nスキャンの位置を記録するように言っています (そこに到達した場合)。

char input[100];
char *p = input;
int count = 0;
if (fgets(input, sizeof input, stdin) == NULL) {
  ;  // handle EOF
}
while (*p)  {
  int n = 0;
  sscanf(p, "%*s%n", &n);
  if (n == 0) break;
  p = &p[n];
  count++;
  }

単語を分離するにはbuffer

char *previousp; 
while (*p)  {
  int n = 0;
  sscanf(p, "%*s%n", &n);
  if (n == 0) break;
  previousp = p
  p = &p[n];
  // At this point `previousp` to p is OP desired output.
  printf(%.*s\n", p - previousp, previousp);
  count++;
  }

OPは使用したかったsscanf()のですが、@Charlie Burnsが提案したようにバッファを単純に行進するのは理にかなっています。

const char *p = buffer;
while (*p) {
  const char *endp = p;
  while (isspace(*endp)) endp++;
  while (*endp && !isspace(*endp)) endp++;
  // At this point `p` to `endp` is OP desired output.
  printf(%.*s\n", endp - p, p);
  p = endp;
}
于 2013-11-02T16:50:26.160 に答える
1

それを文字列に読み込み、解析します。

スペースがあるかどうかを検出した後、sscanf() を使用して、scanf と同じように文字列を解析できます。

于 2013-11-02T16:38:49.933 に答える