使用gets()缓冲存储

问题描述 投票:-5回答:2

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

以下是我在在线课程中使用的一行代码,我试图了解gets()在这里是如何工作的。我在学习C时使用Visual Studio,并且教师在使用gets()时返回不同的输出(他正在使用CodeLite)。对于他来说,当他在命令提示符中输入超过5个字符的firstname时,缓冲区会将额外的字符溢出到后续的char变量lastname中。对我来说,当我输入额外的字符时,我的printf()将返回我输入的内容。例如:如果我输入名字:乔治姓氏:华盛顿,它将返回“你好,乔治,华盛顿。”,对他来说,它将返回“你好,格奥尔格,eWash。”

Visual Studio是否在我的gets()s之间的缓冲区上执行某种刷新?如果在命令提示符下输入超过5个字符,它将在我的firstname和lastname char变量中存储所有字符,那么在char firstname [5]中指定'5'是什么意思?为什么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;
}
c visual-studio fgets gets
2个回答
0
投票

char firstname [number]中的数字是您为该字符数组分配的字符数。例如,如果使用6作为数字,则可以在该变量中添加6个字符。如果使用超过6个字符,则会产生Buffer Overflow。您可以查看C tutorials了解更多信息


-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);
}
© www.soinside.com 2019 - 2024. All rights reserved.