c - 如何检查索引是否包含符号?

标签 c arrays

我想检查以确保名为 secretWord 的数组中包含的给定字符串中没有符号(例如 $ % & #)。如果其中确实有符号,我会让用户重新输入该字符串。它利用递归不断询问,直到输入不包含符号的字符串。

接受的唯一符号是NULL符号(由ASCII值零表示的符号)。这是因为我用 NULL 符号填充了数组中的所有空白区域。

我的功能如下:

void checkForSymbols(char *array, int arraysize){ //Checks for symbols in the array and if there are any it recursively calls this function until it gets input without them.
 for (int i = 0; i < arraysize; i++){
    if (!isdigit(array[i]) && !isalpha(array[i]) && array[i] != (char) 0){
      flushArray(array, arraysize);
      printf("No symbols are allowed in the word. Please try again: ");
      fgets(secretWord, sizeof(secretWord) - 1, stdin);
      checkForSymbols(secretWord, sizeof(secretWord));
    }//end if (!isdigit(array[i]) && !isalpha(array[i]) && array[i] != 0)
    else
      continue;
  }//end for(i = 0; i < sizeof(string[]); i++){
}//end checkForSymbols

问题:当我输入任何输入(参见下面的示例)时,if语句就会运行(它打印Nosymbols are allowed in the word. Please再试一次: 并要求新的输入)。 我认为问题显然源于语句 if (!isdigit(array[i]) && !isalpha(array[i]) && array[i] != (char) 0)。但我也尝试将 (char) 0 部分更改为 '\0'0 ,但这两种更改都没有任何效果。

那么如何比较索引中的内容是否是符号呢?为什么没有符号的字符串会关闭此 if 语句?

如果你们有人想知道我使用的“flushArray”方法是什么,那就是:

    void flushArray(char *array, int arraysize){ //Fills in the entire passed array with NULL characters
  for (int i = 0; i < arraysize; i++){
    array[i] = 0;
  }
}//end flushArray

该函数在 main() 方法的第三行调用,紧接在第一行要求用户输入单词的 print 语句之后,以及第二行获取输入的 fgets() 语句之后这个checkForSymbols函数就用在了。


根据请求,一个示例是,如果我输入“Hello”作为 secretWord 字符串。然后程序在其上运行该函数,并且 if 语句由于某种原因被触发,导致它

  1. secretWord 数组中存储的所有值替换为 ASCII 值 0。(也称为 NULL)
  2. 打印单词中不允许有任何符号。请重试:到控制台。
  3. 等待将存储在 secretWord 数组中的新输入。
  4. secretWord 中存储的这些新值调用 checkForSymbols() 方法。

无论您输入什么内容作为新的 SecretWord,checkForSymbols() 方法的 if 语句都会触发,并再次重复步骤 1 - 4。


感谢您的耐心和理解,并提供帮助!

最佳答案

您可以执行类似的操作来查找代码中的符号,将代码放在正确的位置

 #include <stdio.h> 
 #include <string.h> 
 int main () { 
      char invalids[] = "@.<#>"; 
      char * temp; 
      temp=strchr(invalids,'s');//is s an invalid character?
      if (temp!=NULL) {
             printf ("Invalid character"); 
      } else {
             printf("Valid character");
      }
  return 0; 
 }

这将检查 s 是否是有效条目,或者类似地,您可以创建一个数组,并在数组不是 null 终止时执行类似的操作。

 #include <string.h> 
 char false[] = { '@', '#', '&', '$', '<' }; // note last element isn't '\0' 
 if (memchr(false, 'a', sizeof(false)){ 
      // do stuff 
 }
如果您的数组不是 null 终止,则使用

memchr

根据@David C.Rankin的建议,您还可以使用strpbrk,例如

 #include <stdio.h> 
 #include <string.h>
 int main () { 
      const char str1[] = ",*#@_$&+.!"; 
      const char str2[] = "@#"; //input string
      char *ret;
      ret = strpbrk(str1, str2);
      if(ret) {
            printf("First matching character: %c\n", *ret); 
      } else {
           printf("Continue"); 
     } 
 return(0); 
 }

关于c - 如何检查索引是否包含符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42195699/

相关文章:

arrays - 如何打印从 watch 连接即时消息返回的数组

java - 在 Java 中高效地循环访问具有多个变量类型的对象数组

Linux内核与用户空间程序的通信

c - 在c中使用gtk3加载和写入二进制文件

javascript - 如何找到数组最小值的id?

php - range() 和 in_array() 行为,我在这里做错了什么?

c++ - 等待命令不会等待子进程完成 c cpp c++

c - C 中的 Strsep 和 iCalendar 解析

c - C 中的内联汇编 : Dynamic registers

Java按空格将字符串转换为字符串数组