使用fgets和strstr的意外结果

Ami*_*sht 2 c

我提出以下用于搜索字符串的两个代码S2在串S1,如果S2中发现S1在那里发现匹配被打印和位置的,则地址 S1应该从匹配的位置被打印到的最后一个字符S1.如果s1 ="上帝是伟大的"并且s2 ="是"那么应该打印匹配的地址以及"很棒".

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);
}
Run Code Online (Sandbox Code Playgroud)

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

Roh*_*han 5

fgets'\n'在读缓冲区中存储- 换行符(按下输入键时输入).所以,你的搜索字符串s2变成"is\n"是不存在的s1,以aptrNULL与正在打印.

您需要修剪'\n's2,你可以做到这一点

fgets(s2,10,stdin);
if(s2[strlen(s2)-1] == '\n')
   s2[strlen(s2)-1] = '\0';
Run Code Online (Sandbox Code Playgroud)

此外,检查aptrNULL打印前.