C语言 函数在另一个函数中返回不同的值



第一个函数检查子字符串中包含的字母个数

int num_matches(char* word, char* letters) {
char scrabble[128];
strcpy(scrabble, letters);
int num = 0;
for (int i = 0; i < strlen(word); i++) {
if (strchr(letters, word[i]) == NULL) {
return -1;
}
for (int j = 0; j < strlen(letters); j++) {
if (word[i] == letters[j]) {
num++;
scrabble[j] = '';
break;
}
}
}
return num;
}

对于"QWOP", "QWOP"返回4。然而,在下面的函数中,它对每个函数调用都返回相同的错误值,即使buff和字母打印为"QWOP", "QWOP"从我的调试尝试。

void read_words(int num_count[128], char* (*word_idx)[128], int argc, char** argv) {
FILE* fp = fopen(argv[1], "r");
char* letters = argv[2];
int idx = 0;
char buff[128];
int result = 0;
while (fgets(buff, 128, fp) != NULL) {
printf("buff:%s letters:%sn", buff, letters);
result = num_matches(buff, letters);
printf("result: %dn", result);
num_count[idx] = result;
char* word = malloc(strlen(buff) + 1);
strcpy(word, buff);
(*word_idx)[idx] = word;
idx++;
result = 0;
}
fclose(fp);
}
buff:QWOP
letters:QWOP
result: -1

我的txt文件:

ABC
DEFG
QWOP
QWOP
QUOKKA
QUOLL
QUASH
QUANDONG

由于fgets在换行符处停止,并且我的文本文件中没有空格,所以我认为阅读buff应该没有任何问题。

fgets读取以n字符结尾的数据。

在这种情况下,你的函数将失败。很容易测试:

int main(void)
{
printf("%dn", num_matches("ABCD", "ABCD"));
printf("%dn", num_matches("ABCDn", "ABCD"));
}

结果:

4
-1

你需要从buff中移除n

另一个问题是第二个函数。参数char* (*word_idx)[128]是一个指针,指向一个包含128个char指针的数组。我不认为那是你想要的。