使用gets()缓冲存储

时间:2017-12-15 21:37:24

标签: c visual-studio fgets gets

这里有新编码。试图研究这个话题,但很难找到从哪里开始的问题,我几乎不知道怎么问......

以下是我在在线课程中使用的一行代码,我试图了解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;
}

2 个答案:

答案 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);
}