为什么第一个 gets() 输入在此 C 程序中丢失?

Why is first gets() input is lost in this c program?

在下面的简单代码中,第一个 gets 的输入没有显示出来。 有什么帮助吗?

int main()
{
    int x;
    char tmp[1];
    char anystr[10], srchstr[1];

    printf("Enter an string : ");
    gets(anystr);

    printf("Enter any character you want to search in input string: ");
    gets(srchstr);

    printf("anystr : %s\n",anystr);
    printf("anystr : %c\n",anystr[0]);
    printf("srchstr : %c\n",srchstr[0]);

    return 0;
}

第一个 fgets 字符串 anystr 的输出为空:

Enter an string : hello
Enter any character you want to search in input string: h
anystr : 
anystr : 
srchstr : h

不要按照 man 3 fges

中的指示使用 gets()

Never use gets(). Because it is impossible to tell without knowing the data in advance how many characters gets() will read, and because gets() will continue to store characters past the end of the buffer, it is extremely dangerous to use. It has been used to break computer security. Use fgets() instead.

使用fgets()喜欢

fgets(anystr,sizeof(anystr),stdin);

此外,char srchstr[1]; 应该是 char srchstr;,正如您在 printf 中所要求的那样 在输入字符串中输入您要搜索的任何字符:

并扫描 srchstr 使用 scanf(" %c",&srchstr);

你可能想要像

这样的东西
int main(void ) {
        char anystr[10],srchstr;
        printf("Enter an string : ");
        fgets(anystr,sizeof(anystr),stdin);/*use fgets instead of gets */

        printf("Enter any character you want to search in input string: ");
        scanf(" %c",&srchstr);/* give the space before %c to avoid buffering problem */

        printf("anystr : %s\n",anystr);
        printf("anystr : %c\n",anystr[0]);
        printf("srchstr : %c\n",srchstr);

        return 0;
}

你有问题,因为你有未定义的行为。
UB 是由于第二个 gets() 写入超过 1-char 数组 srchstr 引起的。 beyond写的是终结符'[=12=]'.
请参阅 gets() 文档:http://en.cppreference.com/w/c/io/gets

这个问题没有答案应该省略提及(使用 Jonathan Lefflers nice link):
Why is the gets function so dangerous that it should not be used?

就是这样。 UB 和危险。完毕。回答结束。

嗯....
关于哪个特定的鼻恶魔在四处飞来飞去的一种推测是:
strchr 正好位于 anystr 之前。这意味着无法访问的那个会命中 anystr.
中的第一个字符 IE。它在零个字符后立即终止其他字符串。
IE。它使它变空。
因此打印它没有输出,即使第二个字符仍然来自先前写入的字符串。