更好地理解C中的strstr

时间:2014-03-04 00:51:30

标签: c string strstr

我之前已经问过关于字符串函数strstr的问题,结果发现我犯了一个愚蠢的错误。现在我又得到了意想不到的结果,无法理解为什么会这样。我编写的代码只是一个简单的测试代码,以便我能更好地理解它,它采用一个包含11个单词的列表的文本文件,并且我试图找到在其余单词中找到第一个单词的位置。我所做的就是将文本文档单词移动到一个二维字符串数组中,然后选择一些我知道应该返回正确值但却返回NULL的文本。 strstr的第一次使用返回正确的值,但我知道的最后3个包含chant里面的单词chant,返回NULL。如果再一次这只是一个愚蠢的错误我让我道歉,但是在这里理解这个字符串函数的任何帮助都会很棒。

文本文件的格式如下:

chant  
enchant    
enchanted    
hello    
enchanter    
enchanting    
house    
enchantment    
enchantress    
truck    
enchants

我编写的代码是:

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

int main(int argc, char *argv[]) {

FILE* file1;
char **array;
int i;
char string[12];
char *ptr;

array=(char **)malloc(11*sizeof(char*));

for (i=0;i<11;i++) {
    array[i]=(char *)malloc(12*sizeof(char));
}

file1=fopen(argv[1],"r");

for (i=0;i<11;i++) {
    fgets(string,12,file1);
    strcpy(array[i],string);
}

ptr=strstr(array[1],array[0]);
printf("\nThe two strings chant and %s yield %s",array[1],ptr);
ptr=strstr(array[2],array[0]);
printf("\nThe two strings chant and %s yield %s",array[2],ptr);
ptr=strstr(array[4],array[0]);
printf("\nThe two strings chant and %s yield %s",array[4],ptr);
ptr=strstr(array[5],array[0]);
printf("\nThe two strings chant and %s yields %s",array[5],ptr);


return 0;
}

2 个答案:

答案 0 :(得分:1)

摆脱\n之后的fgets()结尾。

for (i=0;i<11;i++) {
    fgets(string, sizeof string, file1);
    size_t len = strlen(string);
    if (len > 0 && string[len-1] == '\n') string[--len] = '\0';
    strcpy(array[i], string);
}

答案 1 :(得分:1)

char *chomp(char *str){
    char *p = strchr(str, '\n');
    if(p)
        *p = '\0';
    return str;
}
...
strcpy(array[i], chomp(string));