удаление пробелов из строки в массиве строк - PullRequest
0 голосов
/ 21 декабря 2018

В настоящее время я работаю над проектом, который читает строки из входного файла и сохраняет их в массиве.Когда он сохраняется в массиве, я хочу удалить пробелы, чтобы я мог сравнить строки в массиве с картами строк массива и проверить, все ли карты из входного файла есть.

Но в настоящее время я застрял в хранении новых строк без пробела в массиве и их распечатке.Он выводит первую строку REDA, но после этого я получаю ошибку сегментации.

Буду также признателен, если кто-нибудь подскажет, как сравнить строки в массиве карт с массивом константи проверьте, все ли карты находятся в массиве.

Я надеюсь, что это правильный подход.

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

const char * stringcard[] = { "REDA","RED2"
                              "RED3"
                              "RED4"
                              "RED5"
                              "RED6"
                              "RED7"
                              "RED8"
                              "RED9"
                              "RED10"
                              "REDJ"
                              "REDQ"
                              "REDK"
                            };

int main (int argc, char **argv) {

    char *reds[13];
    char * cardarray[13];

    int i;

    FILE *file = argc > 1 ? fopen (argv[1], "r") : stdin;
    if (file == NULL)
        return 1;
    if(argc!=2) {
        printf("[ERR]");
        return 0;
    }

    for (i =0; i < 13; i++) {

        reds[i] = malloc( 8);
        fgets(reds[i], 8, file);

    }

    int i2 = 0;
    for (i =0; i < 13; i++) {

        printf ("%s", reds[i]);

    }

    for(i= 0; i<13; i++) {
        char *p = strtok (reds[i], " ");


        while (p != NULL)
        {
            cardarray[i2++] = p;
            p = strtok (NULL, " ");
        }
    }

    for (i =0; i < 13; i++) {

        printf ("%s", cardarray[i]);

    }


    return 0;
}

Входной файл:

RED A
RED 2
RED 3
RED 4
RED 5
RED 6
RED 7
RED 8
RED 9
RED 10
RED J
RED Q
RED K

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Просто удалите ненужный символ.Здесь у вас есть две функции:

Первый алгоритм намного быстрее.Второй медленнее, но легко понять

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

char *removechar(char *str, int ch)
{
    char *cptr = str, *readptr = str;

    while(*readptr)
    {
        if(*readptr == ch)
        {
            readptr++;
        }
        else
        {
            *cptr++ = *readptr++;
        }
    }
    *cptr = 0;
    return str;
}

char *removechar(char *str, int ch)
{
    char *cpos = str;

    while((cpos = strchr(cpos, ch)))
    {
        strcpy(cpos, cpos + 1);
    }
    return str;
}

0 голосов
/ 21 декабря 2018

Есть как минимум 2 проблемы:

Во-первых: в этом цикле вы увеличиваете значение i в два раза, что в итоге приводит к переполнению буфера.

for (i = 0; i < 13; i++) {
    char *p = strtok(reds[i], " ");    

    while (p != NULL)
    {
      if (i >= 13)           // debug code
      {                      // debug code
        printf("Bummer\n");  // debug code
        exit(1);             // debug code
      }                      // debug code
      cardarray[i++] = p;
      p = strtok(NULL, " ");
    }
  }

Во-вторых: вы не делаетеЗдесь можно выделить достаточно памяти:

reds[i] = malloc(sizeof(char) * (4 + 1));   // you allocate space for 5 chars
fgets(reds[i], 13, file);                   // and here you tell fgets that
                                            // your buffer has a length of 13 chars...

Скорее всего, ошибок больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...