2013-11-02 32 views
2

是否可以在文本中用空格+一个字只在C中扫描?使用scanf只扫描一个字,但在前面有空格

这里的示例文本:

"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; 

空间是在这个词的前面。 Punctuaions被算作有效字符。

谢谢chux的诀窍,谢谢你的回答。

+0

用fgets读取该行,用strtok对其进行扫描。 –

+0

@CharlieBurns:使用'strtok()'blats(zaps,覆盖)分隔符;整个字符串是需要的,所以你不能在这里使用'strtok()'。 –

+0

如果每个单词之间有几个空格,您希望输出什么?为什么你认为领先的空间很重要,因为他们肯定会使这成为一个难题? –

回答

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伯恩斯的建议是有道理的。

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; 
} 
+1

+1聪明。这将是善意的,以显示如何隔离的话。我不明白为什么'sscanf()'只要'p'不是空指针(它不应该是),sscanf()'就会返回除零之外的任何东西。 'sscanf()'的一些相对晦涩的特性很奇怪的使用,但它们很好地完成了这项工作。你不能用'scanf()'做直接输入。那会失去构成这个词的字符。 –

1

将它读入一个字符串 - 然后解析它。

可以使用的sscanf()解析字符串在同是作为scanf函数,检测后,如果有一个空间

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!' 

并做了正确的事情与原来的投入。

相关问题