[C / C ]得到() 和fget() 在C / C – 当用户得到警告() – 警告在使用时获得()

通常我们使用一个变量进入功能scanf函数(), 这个功能是用于输入 1 字符串但与空白符号会见 (空间, 进入,…) 那就不要再阅读,该字符串从切, 例如进入 “阮文机构” 那么我们只能得到 “阮”.
这里的解决方法是我们使用的功能得到() 进入字符串. 😀 Khi đó ta sẽ nhận được chuỗi nguyên vẹn.
但是出现了一个棘手的事情是,如果缓冲区 (标准输入文件) 其中包含的字符没有被读 (VD空白由scanf函数() 仍然无法读取该文件标准输入) 它得到() 正确接收信件,并没有输入字符串 (浮动命令的现象). 而我们在治疗前用得到() 加入 1 标准输入命令来删除fflush夜(标准输入). 然后,我们能够输入字符串 1 稳定

 
#include <stdio.h>
  
int main()
{
    int age;
    char name [256];
    printf ("Insert your age: ");
    scanf("%d",&age);
    fflush(stdin);
    printf ("Insert your name: ");
    gets (name);
    printf ("Your name is: %s and you are %d years oldn",name, age);
    return 0;
}

但是,问题再次出现在我们看不到的窗户 1 在代码中的警告, 天鹅绒虽然没有错误,但出现在Linux代码 2 问题. 首先,该机将编译警告 ” 警告: “字符*获得(字符*)“已过时 (declared at /usr/include/stdio.h:638) [-Wdeprecated-declarations] ” và thứ hai là lệnh fflush(标准输入) sẽ không có tác dụng, ta lại bị trôi lệnh.

Trước tiên ta đi xử lý cảnh báo này. Trong cuốn sách “Secure Programming Cookbook for C and C++” có một đoạn ở chương 3.1 có nói rằng: 得到() là một hàm nằm trong bộ thư viện cũ của C. 这个功能是用于输入链,但很舒服,但是有一个非常危险的点的缓冲区的大小不检查输入的数据. 这将使得程序崩溃或更糟,如果整个系统崩溃,如果输入超过声明或处理. 特别是在Linux上, 内存管理非常严密 (更多的窗口 !) 所以警告是完全正确, 没有新的警告是有问题 !
您可以通过在窗口编译程序试试. 在大多数情况下 (使用许多不同的编译器) 没有警告. 但在其他Linux, 因为它是唯一的机制,以确保系统的稳定性, 确保系统不被吃掉被流弹程序员 , 否则GCC编译器是免费的,但很现代,但, 它总是修复和最新标准的C / C 的更新
(评论 drnoxxx 在ddth.com)
那么该如何处理呢? 对于我们的一个解决方案是使用与fgets() 进入. 与fgets() 是一种功能,使我们能够从文件导入并输入链时指定的大小. 代码说明用于导入文件

#include <stdio.h>

int main()
{
	FILE * pFile;
	char mystring [100];
	pFile = fopen ("myfile.txt" , "r");
	if (pFile == NULL) perror ("Error opening file");
	else
	{
		if ( fgets (mystring , 100 , pFile) != NULL ) //nhap chuoi toi da 100 phan tu tu file
		puts (mystring);
		fclose (pFile);
   }
   return 0;
}

但是,如果你想使用与fgets达音科() 从键盘,明星进入? 很简单, 你不需要申报文件如上, 只需更换标准输入的文件是由好吗 !

fgets (mystring , 100 , stdin);

解决第一个问题 2 如果不使用fflush缓冲器被删除(标准输入) ? 答案很简单,只是从stdin读取所有空​​间 1 某些变量,并继续他的工作是好的.
但使用与fgets当另一个问题就出现了() 从键盘输入,当你完成输入的字符串必须按回车键,它会永远读你进入钥匙链, 当光标会自动换行, 当我们想要写这变得很困难 2 xuau相同 1 当前. 解决这一问题,我们使用的另一种技术,增加了一个NULL分配给香蕉的最后一个字符输入命令

string[strlen(string)-1] = '&#092;&#048;'; //chu ý khai báo string.h

下面是所用的代码与fgets().

#include <stdio.h>
#include <string.h>
int main()
{
	int age;
	char name [256];
	printf ("Insert your age: ");
	scanf("%d",&age);
	if (fgets (name,256,stdin) != NULL); //xoa bo dem
	//fflush(stdin); //khong co tac dung xoa bo dem
	printf ("Insert your name: ");
	if (fgets (name,256,stdin) != NULL); //nhap ten
	name[strlen(name)-1] = '&#092;&#048;';
	printf ("Your name is: %s and you are %d years oldn",name, age);
	return 0;
}