检查数组是否包含所有元素

标签 c arrays string pointers compare

我编写了一个从 txt.file 读取的代码,将其存储到一个数组中,删除空格,然后将其打印出来。 我想添加另一个功能。这次是检查用户是否提供了正确的输入文件。 我想将数组 reds 与数组 stringcard 进行比较,看看数组 red 是否包含数组 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

最佳答案

这是我的热门评论的序言。

这应该适用于任何顺序的卡片:

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");
<小时/>

更新:

if we know reds is sorted compare the result of strcmp with -1 or 1 rather than 0 depending on the order of the sorted elements. If stringcard is sorted of course exchange the roles

好吧,如果我们假设 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");

关于检查数组是否包含所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53889548/

相关文章:

c - Linux编程: Writing to duplicated socket fails

c - 如何用 C 语言通过 PIC 微 Controller 的 UART 编写十六进制字符串?

javascript - 获取 JSON 键的文本值

c - 有没有办法更好地路由流程?

c - 使用switch语句调用函数不起作用

Java:具有并行数组的快速排序算法

arrays - 在 Angular 2 中将 Json 数据从服务器存储到数组

java - 如何使用 for 循环从数组的每个第 n 个元素开始循环?

Java 字符串 - UTF 和字节表示

ios - 如何使用 nsrange 从具有 emoj 的字符串中获取某些部分