这里有新编码。试图研究这个话题,但很难找到从哪里开始的问题,我几乎不知道怎么问......
以下是我在在线课程中使用的一行代码,我试图了解gets()在这里是如何工作的。我在 C 中使用 Visual Studio ,并且在使用gets()时教师正在返回不同的输出(他正在使用CodeLite)。对于他来说,当他在命令提示符中输入超过5个字符的 firstname 时,缓冲区会将额外的字符溢出到后续的char变量 lastname 中。对我来说,当我输入额外的字符时,我的printf()将返回我输入的内容。例如:如果我输入名字:乔治姓氏:华盛顿,它将返回"你好,乔治,华盛顿。",对他而言,它会返回"您好,Georg,eWash。"
Visual Studio 在我的gets()s之间的缓冲区上执行某种刷新吗?而指定' 5'有什么意义呢?在 char firstname [5] 中如果我在命令提示符下输入超过5个字符,它会将所有字符存储在我的firstname和lastname char变量中吗?为什么fgets()在这种情况下会成为更好的解决方案?
#include <stdio.h>
void flush_input(){
int ch;
while ((ch = getchar()) != '\n' && ch != EOF);
}
void getinput_with_gets() {
char firstname[5];
char lastname[5];
printf("Enter your first name:");
gets(firstname);
printf("Enter your last name:");
gets(lastname);
printf("Hello, %s, %s\n", firstname, lastname);
}
void getinput_with_fgets() {
char firstname[5];
char lastname[5];
printf("Enter your first name:");
fgets(firstname, 5, stdin);
printf("Enter your last name:");
// fflush(stdin); // This function may not (invariably) work with input!
flush_input();
fgets(lastname, 5, stdin);
flush_input();
printf("Hello, %s, %s\n", firstname, lastname);
}
int main(int argc, char **argv) {
getinput_with_gets();
// getinput_with_fgets();
return 0;
}
答案 0 :(得分:0)
char firstname [number] 中的数字是您为该字符数组分配的字符数。例如,如果使用6作为数字,则可以在该变量中添加6个字符。如果使用超过6个字符,则会产生Buffer Overflow。您可以查看C tutorials了解更多信息
答案 1 :(得分:-2)
如果在c ++代码中使用带有visual c ++和数组参数的“gets”,则使用“安全”模板重载而不是来自C库的gets,该函数模板转发到msvc的gets_s函数,该函数采用缓冲区长度参数
基本上它调用(返回类型可能会关闭,但这会产生想法):
template<typename Elem, size_t N>
size_t gets(ElElem (&arr)[N])
{
return gets_s(arr, N);
}