Scanf过滤输入

时间:2019-06-16 22:02:42

标签: c scanf

我的问题很简单,我想使用scanf过滤输入并将每个单词放入array of string (array char 2d)

我尝试过fgetc(),但至少对我来说每个单词都很难。

data.txt
add $t3,$s3,$s5
sh $v0,8($s0)

预期结果:

add 
$t3
$s3
$s5   
sh
$v0
8
$s0

假设我们需要一个10x10的数组:

char test [10][10];

strcpy(test[0],"add");
...
... // looping until the last input
...
strcpy(test[7],$s0);


-编辑-

我尝试了这段仅处理一行测试的代码:

    char test[10][10]
    char c;
    unsigned int i = 0 , j = 0;
    FILE *fp = fopen("./data.txt", "rb");

    while((c=fgetc(fp)) != EOF )
            {     
                if (c == ' ' || c == '(' || c == ')' ){

                }else if( c == '$' || (c == ',')){
                    i++;
                    j = 0;
                    test[i][j]=c;
                    j++;

                }else if(c == '\n'){
                    i = 0;
                    j = 0;
                    break;
                }else{
                    test[i][j]= c;
                    j++;
                }
            }



感谢您的时间。

2 个答案:

答案 0 :(得分:2)

我来晚了,但是如果您不需要为此使用scanf()系列功能,则可以使用strtok()

做类似的事情

FILE *fin = fopen("input.txt", "r");
if(fin==NULL)
{
    return -1;
}
char buff[50];
while(fgets(buff, sizeof(buff), fin)!=NULL)
{
    for(char *ptr=strtok(buff, " (),\n"); ptr!=NULL; ptr=strtok(NULL, " (),\n"))
    {
        printf("%s\n", ptr);
    }
}

strtok()的第二个参数是一个字符串,每个字符都是我们要提取的标记的定界符。

对于给定的输入,输出将为

add
$t3
$s3
$s5
sh
$v0
8
$s0

答案 1 :(得分:1)

#include <stddef.h>
#include <stdio.h>
#include <string.h>


#define ARRAY_SIZE(arr)     (sizeof(arr) / sizeof((arr)[0]))
#define ARRAY_SSIZE(arr)    ((ptrdiff_t)ARRAY_SIZE(arr))


int     main    (void)
{
        FILE        *fp;
        char        buff[BUFSIZ];
        char        *s;
        ptrdiff_t   len;
        char        str[10][10][10];
        int         n;

        fp = fopen("./data.txt", "r");

        memset(str, 0, sizeof(str));

        for (ptrdiff_t i = 0; i < ARRAY_SSIZE(str); i++) {
                if (!fgets(buff, sizeof(buff), fp))
                        break;

                len = strlen(buff);
                s   = buff;
                for (ptrdiff_t j = 0; ((s - buff) < len) &&
                                (j < ARRAY_SSIZE(str[0])); s += n+1, j++) {
                        n   = 0;
                        if (sscanf(s, " %9[^ ,()\n]%n", str[i][j], &n) == EOF)
                                break;
                }
        }

        for (ptrdiff_t i = 0; i < ARRAY_SSIZE(str); i++) {
                for (ptrdiff_t j = 0; j < ARRAY_SSIZE(str[0]); j++) {
                        if (str[i][j][0])
                                printf("%s\n", str[i][j]);
                }
        }

        return  0;
}

我将每一行分开,以便您在需要时可以分别玩耍。

这是最重要的一行:

                    if (sscanf(s, " %9[^ ,()\n]%n", str[i][j], &n) == EOF)
                            break;

它从字符串s读取," %9[^ ,()\n]"丢弃所有空格并接受char的数组,直到找到以下第一个字符为止:" ,()\n"或直到它达到最大长度9(9 + '\0' = 10)。字符串存储在str[i][j]中;之后,"%n"n中存储缓冲区中消耗的字符数,以便您可以将char *更新为指向下一个未读字符(实际上是该字符之后的一个),因为我们知道第一个未读字符将是逗号或类似的东西,所以它将成为我们不希望使用的字符。该工作(更新指针)在此行中完成:

            for (ptrdiff_t j = 0; ((s - buff) < len) &&
                            (j < ARRAY_SSIZE(str[0])); s += n+1, j++) {