Scanf для фильтрации ввода - PullRequest
0 голосов
/ 17 июня 2019

Мой вопрос довольно прост, я хочу использовать 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);


- EDIT -

Я попробовал этот код, который обрабатывает всего одну строку для тестирования:

    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 ]

2 голосов
/ 17 июня 2019

Я опоздал, но все же, если вам не нужна семейная функция 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 голос
/ 17 июня 2019
#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++) {
...