用二维数组实现strcmp
不久前我问了一个问题,根据我得到的答案,我大幅修改了我的课程。虽然使用二维数组的strcmp方法,但我现在遇到了问题。以下是我计划的要点: 我试图编写一个程序,检查输入到程序中的单词是否与预定义的关键字匹配。输入将来自一个文本文件,文本文件中只有一个单词。到目前为止,我的文本文件中只有“dog”一词,这意味着程序应该清楚地打印“Match Found!”但实际上,当文本文件中的单词为“crackerjack”时,它会打印“未找到匹配项”,这表明它没有检查关键字数组中的每个单词,只是检查第一个单词。这是我的密码,有什么值得你们注意的吗?谢谢用二维数组实现strcmp,c,arrays,multidimensional-array,C,Arrays,Multidimensional Array,不久前我问了一个问题,根据我得到的答案,我大幅修改了我的课程。虽然使用二维数组的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 terminatemessage
。@Lundin strncmp不是很糟糕,也不是过时的(没有strncpy);这是一场灾难。(你的链接是关于cat和cpy的,不是cmp)。@JimBalter Gah,是的。我不知道我在发布时是怎么想的,谢谢你的更正。注释已删除。0不是NULL。NULL不是字符串NULL终止。
char message[141] = {0};
char *keywords[NUM] = {
"crackerjack",
"hey",
"dog",
"feet"
};