我创建了一个链接列表,其中包含从文件中读取的颜色名称(匈牙利语)。我的程序应该做的是将 s 字符串与文件内容进行比较。如果匹配,则从文件中打印出相应的名称。但它不会做该死的事情。
What could be the issue?
文件内容:
zold piros sarga lila rozsaszin tukiszkek fekete feher narancs okkersarga szintelen
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 30
int getl(char s[], int lim) /*ez a függvény kéri be a beolvasandó karakterláncot*/
{
int c,i;
for(i = 0; i < lim && (c = getchar()) != '\n' && c!=EOF; i++)
s[i] = c;
s[i] = '\0'; // tömb lezárasa
while(c != '\n' && c!=EOF)
c=getchar(); // puffer ürítése
return i; // visszateresi értek: string hossza
}
struct szinek {
char szinek[MAX];
struct szinek *kov;
};
int main()
{
FILE *fp;
char s[MAX] = "zold";
fp = fopen("/home/dumika/Desktop/szinek.txt", "r");
if(!fp) return;
struct szinek *llist, *head = NULL, *prev = NULL;
while(fgets(s, MAX, fp)) {
if(!(llist = (struct szinek*)malloc(sizeof(struct szinek)))) break;
if(head) {
prev->kov = llist;
} else {
head = llist;
}
prev = llist;
llist->kov = NULL;
strcpy(llist->szinek, s);
}
llist = head;
while(llist != NULL)
{
if(!strcmp(llist->szinek, s))
{
printf("%s", llist->szinek);
}
llist = llist->kov;
}
}
最佳答案
你的程序对我来说工作得很好。我怀疑两件事的结合让您感到困惑:
您使用
"zold"
初始化缓冲区s
,但您使用该缓冲区读取文件的行,从而覆盖初始内容。因此,当您稍后扫描链表时,您要查找的是您读取的最后一个字符串,而不是"zold"
。如果数据文件中
szintelen
之后有一个换行符,那么您的程序读取的最后一行将是空白或空的。当您的程序打印匹配项时,您可能不会将其识别为真正正确的输出。
您可以通过向程序在这种情况下发出的输出中添加一些文本来验证程序是否成功匹配字符串。例如:
if(!strcmp(llist->szinek, s)) {
printf("found '%s'\n", llist->szinek);
}
您可以通过在比较中使用字符串文字而不是 s
来测试特定字符串,或者为比较值创建一个单独的数组。例如:
if(!strcmp(llist->szinek, "zold")) {
printf("found '%s'\n", llist->szinek);
}
对于后者,不要忽视遵循注释中的建议以删除 fgets()
包含的尾随换行符。
关于c - strcmp 不适用于链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37665596/