我创建了一个链接列表,其中包含从文件中读取的颜色名称(匈牙利语)。我的程序应该是将s字符串与文件内容进行比较。如果匹配,则从文件中打印出相应的名称。但它不会做一个该死的事情。
可能是什么问题?
文件内容:
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;
}
}
答案 0 :(得分:2)
你的程序对我来说很好。我怀疑两件事情的结合让你感到困惑:
使用s
初始化缓冲区"zold"
,但是使用该缓冲区读取文件的行,从而覆盖初始内容。因此,当您稍后扫描链接列表时,您正在查找您阅读的最后一个字符串,而不是"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()
所包含的尾随新行。