Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用二维数组实现strcmp_C_Arrays_Multidimensional Array - Fatal编程技术网

用二维数组实现strcmp

用二维数组实现strcmp,c,arrays,multidimensional-array,C,Arrays,Multidimensional Array,不久前我问了一个问题,根据我得到的答案,我大幅修改了我的课程。虽然使用二维数组的strcmp方法,但我现在遇到了问题。以下是我计划的要点: 我试图编写一个程序,检查输入到程序中的单词是否与预定义的关键字匹配。输入将来自一个文本文件,文本文件中只有一个单词。到目前为止,我的文本文件中只有“dog”一词,这意味着程序应该清楚地打印“Match Found!”但实际上,当文本文件中的单词为“crackerjack”时,它会打印“未找到匹配项”,这表明它没有检查关键字数组中的每个单词,只是检查第一个单词

不久前我问了一个问题,根据我得到的答案,我大幅修改了我的课程。虽然使用二维数组的strcmp方法,但我现在遇到了问题。以下是我计划的要点:

我试图编写一个程序,检查输入到程序中的单词是否与预定义的关键字匹配。输入将来自一个文本文件,文本文件中只有一个单词。到目前为止,我的文本文件中只有“dog”一词,这意味着程序应该清楚地打印“Match Found!”但实际上,当文本文件中的单词为“crackerjack”时,它会打印“未找到匹配项”,这表明它没有检查关键字数组中的每个单词,只是检查第一个单词。这是我的密码,有什么值得你们注意的吗?谢谢

#define NUM 4
#define SIZE 12

int isAlpha(char);

//Returns 1 if it is an Alphabetical character, 0 if it is not
int isAlpha(char c) {
  return (c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z');
}

int main() {
  char message[141];
  int charCount = 0, c = 0, matchCheck = 0, anyMatch = 0;

  char keywords[NUM][SIZE] = {
    "crackerjack",
    "hey",
    "dog",
    "feet"
  };

  //Removes non alphabetical characters
  while((c = getchar()) != EOF && charCount <= 140) {
    if(isAlpha(c)){
      message[charCount] = c;
      charCount++;
    }
  }

  //checks if message matches keyword
  for (int i = 0; i < NUM; i++) {
      if(strcmp(message, keywords[i]) == 0){
        matchCheck = 1;
        break; 
      }
  }  

  //prints "Match Found!" if there was a match
  if (matchCheck == 1)
    printf("Match Found!\n");
  else 
    printf("No Match Found\n");

return(0);

}
#定义数字4
#定义大小12
int-isAlpha(char);
//如果是字母字符,则返回1;如果不是,则返回0
int isAlpha(字符c){

return(c>='A'&&c='A'&&c您不需要NUL terminate
消息
。它在堆栈上包含垃圾,可能在前3个字符之后的某个位置有一个非NUL,当您读“crackerjack”时,非NUL会被覆盖,但当您读“dog”时则不会被覆盖

#include <ctype.h>
while((c = getchar()) != EOF && charCount <= 140) {
  if(isalpha((unsigned char)c)){
    message[charCount++] = c;
  }
}
message[charCount++] = '\0';
但是,如果需要在运行时更改
关键字
的内容,则应按照
char-keywords[][SIZE]={…};
的方式进行


感谢Jim将此作为注释提出。您不应该使用自己的
isAlpha
,而应该使用标准库函数
isAlpha
,它接受
int
,但只定义了
unsigned char
范围内的行为,因此键入您的输入并将其传递给
isAlpha
。但是,如果您的输入可以超过256,那么您应该以不同的方式处理它。

您应该将消息字符数组初始化为
0
strcmp()
需要它,以便它可以比较两个字符串(它需要知道字符串的终止位置)

因此,改变:

char message[141];

除此之外,将关键字定义更改为:

char *keywords[NUM] = {
    "crackerjack",
    "hey",
    "dog",
    "feet"
  };

非常感谢,我现在可以继续我的程序了,你帮助我克服了一个我一直在努力解决的问题。非常感谢!@user2817587通常一个人写
char*keywords[]={…}
,消除了对
大小的需要。当你使用时,你也可以使用
中的
isalpha
。:-(不过要注意带有负参数的UB。)(是的,
常量也很好;+1)我不理解您添加的最后一行…可以通过替换指针来进行更改。我想这取决于将进行何种更改。如果要添加关键字,列表需要malloced。@JimBalter:我的意思是更改实际的字符串,如果将其声明为指针,则不应进行更改,因为字符串将是al位于
.rodata
即只读内存中。这就是我用
const
扩充它的原因。使用
strncmp
而不是
strcmp
strncmp(message,keywords[i],charCount)
可以工作,但最好是NUL terminate
message
。@Lundin strncmp不是很糟糕,也不是过时的(没有strncpy);这是一场灾难。(你的链接是关于cat和cpy的,不是cmp)。@JimBalter Gah,是的。我不知道我在发布时是怎么想的,谢谢你的更正。注释已删除。0不是NULL。NULL不是字符串NULL终止。
char message[141] = {0};
char *keywords[NUM] = {
    "crackerjack",
    "hey",
    "dog",
    "feet"
  };