我正在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语句永远不会执行以及如何修复它?谢谢!
答案 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';