Проверка, содержит ли массив все элементы - PullRequest
0 голосов
/ 21 декабря 2018

Я написал код, который читает из txt.file, сохраняет его в массиве, удаляет пробелы, затем распечатывает их.Я хочу добавить еще одну функциональность.На этот раз нужно проверить, предоставил ли пользователь правильный входной файл.Я хочу сравнить красные массивы с массивом stringcard и посмотреть, содержит ли красный массив все элементы массива stringcard.Я долго искал в интернете, но не знаю, как решить эту проблему.

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h>
#define max 13
#define stringlength 8
const char *stringcard[] = {
  "REDA",
  "RED2",
  "RED3",
  "RED4",
  "RED5",
  "RED6",
  "RED7",
  "RED8",
  "RED9",
  "RED10",
  "REDJ",
  "REDQ",
  "REDK",
};
char * removechar(char str[], int ch) {

  char * cpos = str;

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

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

  char * reds[max];

  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 < max; i++) {

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

  }

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

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

  }

  // removes spaces
  for (i = 0; i < max; i++) {

    removechar(reds[i], ' ');

  }

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

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

  }

int success = 1;
size_t size = sizeof(stringcard)/sizeof(stringcard[0]); 
size_t size2 = sizeof(reds)/sizeof(reds[0]);

if(size == size2)
{
    for(int i = 0; i<size;i++)
    {
        if(strcmp(stringcard[i], reds[i]) != 0){ 
            success = 0; 
        printf("nope");
            break; 
            }
    }




}

      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

Ответы [ 3 ]

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

Это предварено моими главными комментариями.

Это должно работать для карт в любом порядке:

size_t size = sizeof(stringcard) / sizeof(stringcard[0]);
size_t size2 = sizeof(reds) / sizeof(reds[0]);

int allmatch = 0;
if (size == size2) {
    allmatch = 1;

    for (int i = 0; i < size; ++i) {
        int curmatch = 0;
        const char *curcard = &stringcard[i];

        for (int j = 0; j < size; ++j) {
            if (strcmp(curcard, reds[j]) == 0) {
                curmatch = 1;
                break;
            }
        }

        if (! curmatch) {
            allmatch = 0;
            break;
        }
    }
}

printf("RESULT: %s\n",allmatch ? "MATCH" : "NOMATCH");

ОБНОВЛЕНИЕ:

если мы знаем, что красные отсортированы, сравните результат strcmp с -1 или 1, а не с 0 в зависимости от порядка отсортированных элементов.Если строка отсортирована, конечно, поменяйтесь ролями

Хорошо, если мы предположим, что stringcard это всегда отсортировано [или мы решили предварительно отсортировать], мы можем добавитьранний выход во внутренний цикл, который может сэкономить небольшое количество времени для неудачного случая:

size_t size = sizeof(stringcard) / sizeof(stringcard[0]);
size_t size2 = sizeof(reds) / sizeof(reds[0]);

int allmatch = 0;
if (size == size2) {
    allmatch = 1;

    for (int i = 0; i < size; ++i) {
        int curmatch = 0;
        char *redcard = reds[i];

        for (int j = 0; j < size; ++j) {
            int cmpflg = strcmp(redcard,stringcard[j]);

            if (cmpflg == 0) {
                curmatch = 1;
                break;
            }

            if (cmpflg > 0)
                break;
        }

        if (! curmatch) {
            allmatch = 0;
            break;
        }
    }
}

printf("RESULT: %s\n",allmatch ? "MATCH" : "NOMATCH");
0 голосов
/ 21 декабря 2018

Всегда старайтесь использовать функции, когда это возможно.

int all_match(const char **table1, const char **table2, size_t t1size, size_t t2size)
{
    for(size_t t1index = 0; t1index < t1size; t1index++)
    {
        int match = 0;
        for(size_t t2index = 0; t2index < t2size; t2index++)
        {
            match = match || !strcmp(table1[t1index], table2[t2index]);
            if(match) break;
        }
        if(!match) return 0;
    }
    return 1;
}
0 голосов
/ 21 декабря 2018

Если ваш другой массив определен аналогично, скажем, inputArray, и оба массива отсортированы перед выполнением следующего, то вы можете использовать код, подобный следующему: (включая количество элементов

//Assumes both arrays are sorted before executing the following
char success = 1;
size_t size = sizeof(stringcard)/sizeof(stringcard[0]); 
size_t size2 = sizeof(inputArray)/sizeof(inputArray[0]);

if(size == size2)
{
    for(int i = 0; i<size;i++)
    {
        if(strcmp(stringcard[i], inputArray[i]) != 0)
        {
            success = 0;
            break;
        }
    }
{    
else
{
    success = 0;
}
//Proceed according to the value of success,
...
...