在c中从数组中删除字符串

在c中从数组中删除字符串,c,C,我有一个程序,在字符串上调用白色、黑色、蓝色、红色和黄色。所以我的问题是如何检查输入的字符串,然后打印未调用的颜色 如果。在我的函数中,为字符串输入了白色、黑色、蓝色、黄色,程序将需要打印F red,这是一种可能性,例如无效输入,如狗、白色、鲸鱼、蓝色、黑色、红色,因此它应该打印黄色 const char *string[5]; string[0] = "White"; string[1] = "Black"; string[2] = "Blue"; string[3] = "Red"; str

我有一个程序,在字符串上调用白色、黑色、蓝色、红色和黄色。所以我的问题是如何检查输入的字符串,然后打印未调用的颜色

如果。在我的函数中,为字符串输入了白色、黑色、蓝色、黄色,程序将需要打印F red,这是一种可能性,例如无效输入,如狗、白色、鲸鱼、蓝色、黑色、红色,因此它应该打印黄色

const char *string[5];
string[0] = "White";
string[1] = "Black";
string[2] = "Blue";
string[3] = "Red";
string[4] = "Yellow";

gets(string);
printf(//);

您可以简化字符串的声明,它应该是
const
,因为我们不会修改它:

const char *strings[] = { "white", "black", "blue", "red", "yellow" };
然后,我们可以使用整数的位来表示已输入的
字符串中的值:

unsigned int flags = 0; /* Zero has no bits set => nothing input so far. */
当我们得到一个输入时,我们通过
字符串
查找匹配项,并在
标志
中设置相应的位:

char input[1024];

if(fgets(input, sizeof input, stdin) != NULL)
{
  const size_t len = strlen(input);
  while(len > 0 && input[len - 1] == '\n')
    input[--len] = '\0';
  for(size_t i = 0; i < sizeof strings / sizeof *strings; ++i)
  {
    if(strcmp(strings[i], input) == 0)
      flags |= 1 << i;
  }
}

我希望,您应该能够使用上面的部分来获得所需的内容。

您可以使用enum轻松做到这一点

定义要使用的颜色

typedef枚举{WHITE=0,黑色、蓝色、红色、黄色}颜色

以及一个数组,用于为每个定义的颜色保存字符串

const char * colors_str[] = {
     [ WHITE ] = "White",
     [ BLACK ] = "Black",
     [ BLUE ] = "Blue",
     [ RED ] = "Red",
     [ YELLOW ] = "Yellow"
};
现在,您可以将字符串与以下颜色进行比较:

strcmp( string_input, colors_str[ i ] )
然后用一个计数器把我们输入的和最终打印的所有颜色数相加

printf( "%s", colors_str[ total - sum ] );
  • total是所有枚举的总和(在本例中为10,因为sum=0+1+2+3+4)

您这里所说的删除是什么意思?您只想打印最后一个字符串,对吗?您可以做的一件事就是获取您要删除或删除的字符串的索引,我们称之为索引。然后将所有字符串从索引+1移动到末尾,向上移动一个位置。do size=size-1;要打印最后一个字符串,只需执行printf(“%s”,s[size-1]);因此,在get S被调用了4次左右,并且它检查了数组中提供的字符串之后,我认为我需要跟踪调用了哪些字符串,然后返回未调用的字符串called@Rinz1er这里的
string
S
都不一样,对吧?你的代码毫无意义。您不能对字符串指针数组调用
gets()
(事实上,您根本不应该使用
gets()
),而且“调用”字符串也没有任何意义。请试着在问题中澄清你想做什么,而不是在评论中。
printf( "%s", colors_str[ total - sum ] );