来自stdin的strcmp()字符串和来自文件的字符串

时间:2015-01-16 09:25:46

标签: c string list file strcmp

我在比较文件中的字符串时遇到问题。 我想从一个字典的文件中创建一个单词列表。我不知道为什么strcmp()只返回-1或1,即使我使用我的文件中的单词。在输出时,我有:1somethingsomething而不是0somethingsomething

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


struct words
{
    char *word;
    struct words *next;
};

void pushBack(struct words **headPointer, char string[])
{
    struct words *pointer;
    pointer = *headPointer;
    if (*headPointer == NULL)
    {

        *headPointer = (struct words*)malloc(sizeof(struct words));
        (*headPointer)->next = NULL;
        (*headPointer)->word = (char*)malloc(sizeof(char)*(strlen(string)+1));
        strcpy((*headPointer)->word, string);

    }
    else
    {
        while (pointer->next != NULL)
        {
            pointer = pointer->next;
        }
        pointer->next = (struct words*)malloc(sizeof(struct words));
        pointer = pointer->next;
        pointer->next = NULL;
        pointer->word = (char*)malloc(sizeof(char)*(strlen(string)+1));
        strcpy(pointer->word, string);
    }
}

void createList(struct words **headPointer)
{
    FILE *fp;
    char string[80];

    if ((fp = fopen("polski.txt", "rw")) == NULL)
    {
        printf ("Nie mogê otworzyæ pliku test.txt do zapisu!\n");
        exit(-1);
    }
    else
    {
        while(fgets(string, 80, fp) != NULL)
        {
            pushBack(headPointer, string);
        }
    }
}

int seek(struct words *head, struct words **wordBeforePointer, struct words **wordAfterPointer)
{
    char string[80];

    printf("Type a word to seek:\n");
    scanf("%s", string);

    *wordBeforePointer = NULL;
    *wordAfterPointer = NULL;

    if (head != NULL)
    {
        if (strcmp(head->word, string) == 0)
        {
            return 1;
        }
        while(head->next != NULL)
        {
            head = head->next;
            printf("%s", string);
            printf("%s", head->word);
            printf("%d", strcmp(head->word, string));
            if (strcmp(head->word, string) == 0)
            {
                return 1;
            }
        }
    }
    return 0;
}

int main()
{
    struct words *head, *wordBefore, *wordAfter;
    head = NULL;
    wordBefore = NULL;
    wordAfter = NULL;


    createList(&head);
    printf("%d", seek(head, &wordBefore, &wordAfter));


    return 0;
}

1 个答案:

答案 0 :(得分:3)

fgets调用实际删除了尾随换行符,因此使用此方法的人经常发现strcmp不起作用仅仅是因为:

"thisword\n" != "thisword"

如果您想手动剥离可以使用以下内容:

while (fgets (inputLine, 80, filePtr) != NULL) {
    // Get size of input line.

    size_t strSize = strlen (inputLine);

    // If there's a newline at the end, remove it.

    if ((strSize > 0) && (inputLine[strSize-1] == '\n'))
        inputLine[strSize-1] = '\0';

    // Do whatever you need to "non-newline" line.

    doSomethingWith (inputLine);
}