scanf简单使用
简单示例:输入一个m行n列的整数数组
2 5
1 9 3 6 5
5 3 7 10 2
scanf输入:
int m=0,n=0; //(a)
int **array = NULL; //(b)
scanf("%d %d", &m,&n); //(c)
//cin >> m >> n;
array = new int*[m];
for(int i(0); i<m; i++)
{
array[i] = new int[n];
for(int j(0); j<n; j++)
{
scanf("%d", &array[i][j]); //(d)
//cin >> array[i][j];
}
}
//输出
for (int i(0); i<m; i++)
{
for (int j(0); j<n; j++)
{
printf("%d ", array[i][j]); //(e)
//cout << array[i][j];
}
printf("
");
//cout << endl;
}
注意:
(1) scanf中参数必须初始化,如语句(1)(2);
(2) scanf中参数前必须加引用符号'&';,如语句(c)(d);
(3) printf中参数前不加“&”,如语句(e);
问题:
(1) 报错“error c4097”
原因:安全性问题,scanf不检查越界问题,故现在编译器会报错;
解决方法:(I) 改用scanf_s,会检查是否越界,第三个参数为输入长度,对于字符串的输入可以很好的避免scanf的越界问题;不过对于上面示例中的单量输入并没有什么优势(但是编译器不会报错,这点很重要)。
(II) 在文件前面添加#pragma warning(disable:4996) ;
(III) 取消勾选“SDL检查”:项目属性 —— C/C++ —— 常规 ——SDL检查,选择“否”;
注:有些地方说在文件前面添加#define _CRT_SECURE_NO_DEPRECATE或者#define _CRT_SECURE_NO_WARNINGS,但是在我的电脑上并不能解决问题。
(2) 没有报错,但是输入时会停止运行
原因:scanf中第二的参量前没有'&';
比较:如上面的程序中cin也可以完成输入,但是效率比scanf低太多,同样cout也比printf效率低太多,故在输入输出较复杂时用scanf与printf较好。