我刚才问了一个问题,由于我收到了答案,我对程序进行了重大修改。我现在遇到麻烦,虽然使用strcmp方法和二维数组。这是我的计划的要点:
我正在尝试编写一个程序来检查输入到程序的单词是否与预定义的关键字匹配。输入将来自文本文件,文本文件中将包含一个单词。到目前为止,文本文件我只有“狗”这个词,这意味着该程序应该清楚地打印出“匹配发现!”但实际上它打印出“No Match Found”当文本文件中的单词是'crackerjack'时,它打印出'Match Found',表明它不是检查关键字数组中的每个单词,只是第一个单词。这是我的代码,你们有什么突出的吗?感谢
#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);
}
答案 0 :(得分:1)
message
,strcmp
的输入未被\0
终止。像这样在循环之后立即执行
#include <ctype.h>
while((c = getchar()) != EOF && charCount <= 140) {
if(isalpha((unsigned char)c)){
message[charCount++] = c;
}
}
message[charCount++] = '\0';
另一种方法是将message
初始化为此char messasge[141] = {0};
之类的所有零,这样您就不必像上面那样终止它了。另外,keywords
可以定义NUM
,而不需要SIZE
或const char* keywords[] = {
"crackerjack",
"hey",
"dog",
"feet"
};
:
keywords
但是,如果您需要在运行时更改char keywords[][SIZE] = { ... };
的内容,则应将其isAlpha
更改为<{1}}。
感谢Jim将此作为评论。您应该使用标准库函数isalpha
而不是使用自己的int
,该函数采用unsigned char
但仅针对isalpha
的范围定义了行为,因此对输入进行了类型转换并将其传递给{{1}}应该这样做。但是,如果您的输入可能超过256,那么您应该以不同的方式处理它。
答案 1 :(得分:0)
您没有NUL终止message
。它包含堆栈中的垃圾,可能在前3个字符之后的某个地方有非NUL,并且当您读取“crackerjack”时非NUL会被覆盖,但当您读取“dog”时则不会被覆盖。
答案 2 :(得分:0)
您应该将消息字符数组初始化为0
。
strcmp()
需要这样才能比较两个字符串(它需要知道字符串的终止位置)。
所以改变:
char message[141];
到
char message[141] = {0};
除此之外,您的关键字定义更改为:
char *keywords[NUM] = {
"crackerjack",
"hey",
"dog",
"feet"
};