为什么我的if语句从未被评估过?

时间:2014-03-31 18:02:18

标签: c string file loops pointers

我正在GCC Ubuntu 10.04中的C90标准中制作一个小程序,它在一行文本中搜索一个单词,如果该单词在该行中,则打印出该行。

我的来源:

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

int main(){
    int bytesSearch;
    size_t n = 400;
    char *sentence, *word;
    FILE *pFile;

    pFile = fopen("The War of The Worlds.txt","r");

    if (pFile != NULL) {
        puts ("Please enter a search word:");
        sentence = (char *) malloc (n + 1);
        word = (char *) malloc (n + 1);
        bytesSearch = getline(&word, &n, stdin);
        while ((getline(&sentence, &n, pFile)) != -1) {
            char* strResult = strstr(sentence, word);
            if (strResult) {
                printf("%s\n", sentence);
            }
        }
    }
    free(sentence);
    free(word);
    fclose(pFile);
    return EXIT_SUCCESS;
}

我的问题是我内心的if语句从来都不是真的,我假设这意味着我的strstr函数调用有问题。有人可以告诉我为什么if语句永远不会执行以及如何修复它?谢谢!

3 个答案:

答案 0 :(得分:4)

这是因为您从标准输入中读取的字符串以未被注意的\n结束。

在这种情况下,搜索行末尾的单词将工作,而在行中间搜索单词将失败,即使它存在。

您可能希望删除复制到word

的尾部换行符

通常会使用以下内容来执行此操作:

size_t size = strlen(word);
size_t end = size - 1;
if (size > 0 && word[end] == '\n')
    word[end] = '\0';

答案 1 :(得分:2)

man page说:

  

ssize_t getline(char **lineptr, size_t *n, FILE *stream)从流中读取整行,存储地址          包含文本的缓冲区为*lineptr。缓冲区为空 -          终止并包含换行符,如果找到了。

因此,在\n中搜索word之前,您需要从sentence的末尾删除if (pFile != NULL) { puts ("Please enter a search word:"); sentence = (char *) malloc (n + 1); word = (char *) malloc (n + 1); bytesSearch = getline(&word, &n, stdin); if (bytesSearch!=-1) { word[strlen(word)-1]='\0'; //removes the '\n' from the word while ((getline(&sentence, &n, pFile)) != -1) { char* strResult = strstr(sentence, word); if (strResult) { printf("%s\n", sentence); } } } else printf("Error taking input!\n"); }

{{1}}

答案 2 :(得分:0)

你需要删除getline读取的'\ n',你可以在读取输入后添加这段代码,

if(word[byteSearch-1]=='\n')
    word[byteSearch-1]='\0';