为什么第一个get()输入在这个c程序中丢失了?

时间:2018-04-22 18:24:44

标签: c 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

2 个答案:

答案 0 :(得分:2)

您遇到问题,因为您有未定义的行为 UB是由超过1-char数组gets()的第二次srchstr写入引起的。除此之外的是终结者'\0' 请参阅gets()文档:http://en.cppreference.com/w/c/io/gets

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

就是这样。 UB和危险。完成。答案结束。

好....
一个特定的鼻恶魔飞来飞去的猜测是: strchr位于anystr之前。这意味着超出访问权限的人会点击anystr内的第一个字符 即它在零个字符后立即终止其他字符串 即它使它变空。
为此打印它没有输出,即使第二个字符仍然来自以前写的字符串。

答案 1 :(得分:1)

请勿使用gets()

中指出的man 3 fges
  

永远不要使用gets()。因为不知道就不可能说出来   该          数据提前读取多少个字符(),因为          gets()将继续存储超过缓冲区末尾的字符          使用极其危险。它已被用来破坏计算机          安全。改为使用fgets()。

使用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;
}