使用fgets和strstr的意外结果

时间:2013-12-27 08:34:52

标签: c

我在字符串 s1 中搜索了两个用于搜索字符串 s2 的代码,如果在 s1 中找到了 s2 然后打印找到匹配位置的地址,并且应从匹配位置打印 s1 s1 的最后一个字符。如果 s1 =“上帝很棒” s2 =“是”,则应打印匹配地址以及“很棒”。< / p>

CODE 1:
#include<stdio.h>
#include<string.h>

void main()
{
    char s1[80]="god is great",s2[10]="is";
    char *searchptr;
    searchptr=strstr(s1,s2);
    printf("%p\n%p\n",searchptr,s1);
    sprintf(s1,"%s",searchptr);
    puts(s1);
}

CODE 2:
#include<stdio.h>
#include<string.h>

void main()
{
    char s1[80],s2[10];
    char *aptr;
    printf("%s\n%s\n","enter a line","enter string to be searched");
    fgets(s1,80,stdin);
    printf("\n");
    fgets(s2,10,stdin);
    aptr=strstr(s1,s2);
    printf("%p\n,aptr);
    sprintf(s1,"%s",aptr);
    puts(s1);
}

在第一个代码中,我已经初始化了字符串及其工作,但第二个代码给出了非常意外的结果。它给出了每种情况下的匹配地址(正如我已经尝试过的) aptr = 0000000 。使用 fgets 时有什么问题,因为在第二个代码中我想要输入从键盘?

1 个答案:

答案 0 :(得分:5)

fgets也会在读缓冲区中存储'\n' - 新行(按下输入键时输入)。因此,您的搜索字符s2变为"is\n" s1aptr中不存在NULL并且正在打印。

您需要从'\n'修剪s2,您可以通过

进行修剪
fgets(s2,10,stdin);
if(s2[strlen(s2)-1] == '\n')
   s2[strlen(s2)-1] = '\0';

另外,请在打印前检查aptr而不是NULL