在下面的简单代码中,第一个获取的输入没有显示出来。 有什么帮助吗?
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
答案 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;
}