C语言输入中对scanf和gets的讨论
2014-03-02 22:32
281 查看
1. scanf的函数原型是 scanf(format,parmeter1,...) ,而gets的函数原型是 gets(char *)。
2. scanf和gets最容易被谈论的差别就是scanf不能接受带空格的字符串,而gets可以。事实上,准确的说,如果一个字符串要被赋值为一个变量,但其中含有空格的话,scanf是不能接受到的,因为scanf遇到空格、换行以及制表符时都会结束针对当前正在接受的这个变量的输入。但gets仅当遇到换行符时才结束针对当前变量的输入。为什么我这么强调当前变量呢?因为如果scanf的第一个参数format为 “%s %s” 时,输入 hello world 时,他会把 hello 赋值给第一个变量而把
world 赋值给第二个变量。而直接用 gets 时,第一个变量的值就是 hello world。 总之,准确的说,scanf 遇到空格、换行及制表符会认为当前变量的输入已结束,而 gets 仅当遇到换行符才会认为当前变量输入结束。
3. 值得思考的是,为什么会是这样呢?这就要关心 scanf 的函数原型了,我强调第一个参数为格式,即 format 是个表示格式的字符串,而该字符串中遇到%d这样的符号时,才告诉程序这是变量需要替换的位置。这一点让 scanf 的输入有了很大的灵活性,比如针对某种特殊的输入要求,每行的格式为 #,#-- -#,# ,其中#表示变量, 我们可以令 format 为 “%d,%d-- -%d,%d”,这样使用就很灵活,而且注意,其中是不是包含了空格?这也就是为什么我在第二点中强调 scanf 遇到空格、换行及制表符会结束“当前变量”的输入,而非结束整个scanf函数的输入!
总结:scanf 遇到空格、换行及制表符会认为当前变量的输入已结束,而 gets 仅当遇到换行符才会认为当前变量输入结束。 scanf 的第一个参数为格式,利用好它可以对于程序的输入有很好的灵活性。
附:一个简单的测试程序:
#include <stdio.h>
int main(){
//input a string with a fixed format
//if we set the format to be #,#,# #,#,#
int a,b,c,d,e,f;
char str[100];
printf("USE SCANF TO GET INPUT:\n");
scanf("%d,%d,%d %d,%d,%d",&a,&b,&c,&d,&e,&f);
printf("ACCEPTED SUCCESS!THE VARIATBLE IS:a:%d,b:%d,c:%d,d:%d,e:%d,f:%d\n",a,b,c,d,e,f);
getchar();//use for block the \n
printf("USE GETS TO GET INPUT:\n");
gets(str);
printf("ACCEPTED SUCCESS!THE VARIATBLE IS:str:%s\n",str);
return 0;
}
程序运行结果:
USE SCANF TO GET INPUT:
1,2,3 4,5,6
ACCEPTED SUCCESS!THE VARIATBLE IS:a:1,b:2,c:3,d:4,e:5,f:6
USE GETS TO GET INPUT:
1,2,3 4,5,6
ACCEPTED SUCCESS!THE VARIATBLE IS:str:1,2,3 4,5,6
2. scanf和gets最容易被谈论的差别就是scanf不能接受带空格的字符串,而gets可以。事实上,准确的说,如果一个字符串要被赋值为一个变量,但其中含有空格的话,scanf是不能接受到的,因为scanf遇到空格、换行以及制表符时都会结束针对当前正在接受的这个变量的输入。但gets仅当遇到换行符时才结束针对当前变量的输入。为什么我这么强调当前变量呢?因为如果scanf的第一个参数format为 “%s %s” 时,输入 hello world 时,他会把 hello 赋值给第一个变量而把
world 赋值给第二个变量。而直接用 gets 时,第一个变量的值就是 hello world。 总之,准确的说,scanf 遇到空格、换行及制表符会认为当前变量的输入已结束,而 gets 仅当遇到换行符才会认为当前变量输入结束。
3. 值得思考的是,为什么会是这样呢?这就要关心 scanf 的函数原型了,我强调第一个参数为格式,即 format 是个表示格式的字符串,而该字符串中遇到%d这样的符号时,才告诉程序这是变量需要替换的位置。这一点让 scanf 的输入有了很大的灵活性,比如针对某种特殊的输入要求,每行的格式为 #,#-- -#,# ,其中#表示变量, 我们可以令 format 为 “%d,%d-- -%d,%d”,这样使用就很灵活,而且注意,其中是不是包含了空格?这也就是为什么我在第二点中强调 scanf 遇到空格、换行及制表符会结束“当前变量”的输入,而非结束整个scanf函数的输入!
总结:scanf 遇到空格、换行及制表符会认为当前变量的输入已结束,而 gets 仅当遇到换行符才会认为当前变量输入结束。 scanf 的第一个参数为格式,利用好它可以对于程序的输入有很好的灵活性。
附:一个简单的测试程序:
#include <stdio.h>
int main(){
//input a string with a fixed format
//if we set the format to be #,#,# #,#,#
int a,b,c,d,e,f;
char str[100];
printf("USE SCANF TO GET INPUT:\n");
scanf("%d,%d,%d %d,%d,%d",&a,&b,&c,&d,&e,&f);
printf("ACCEPTED SUCCESS!THE VARIATBLE IS:a:%d,b:%d,c:%d,d:%d,e:%d,f:%d\n",a,b,c,d,e,f);
getchar();//use for block the \n
printf("USE GETS TO GET INPUT:\n");
gets(str);
printf("ACCEPTED SUCCESS!THE VARIATBLE IS:str:%s\n",str);
return 0;
}
程序运行结果:
USE SCANF TO GET INPUT:
1,2,3 4,5,6
ACCEPTED SUCCESS!THE VARIATBLE IS:a:1,b:2,c:3,d:4,e:5,f:6
USE GETS TO GET INPUT:
1,2,3 4,5,6
ACCEPTED SUCCESS!THE VARIATBLE IS:str:1,2,3 4,5,6
相关文章推荐
- C语言输入中对scanf和gets的讨论
- c语言获取用户输入字符串是scanf和gets的区别
- C语言中scanf()与gets()在输入字符串的差别
- C语言中输入函数(scanf()、fgets()和gets())的区别详解
- c语言获取用户输入字符串是scanf和gets的区别
- 【C语言天天练(十五)】字符串输入函数fgets、gets和scanf
- gets与scanf_C语言中两种字符串输入方法比较
- c语言获取用户输入字符串是scanf和gets的区别
- c语言获取用户输入字符串是scanf和gets的区别详解
- scanf( )和gets如何用C语言从键盘上输入并打印一串字符串的比较
- 【C语言天天练(十五)】字符串输入函数fgets、gets和scanf
- scanf()、gets()和getline()读取输入
- 简谈C语言中的scanf()输入函数的坑点之一
- C语言中字符串输入中scanf与gets函数的区别
- 深入解析scanf()/getchar()和gets()等函数针对字符串输入的问题
- C语言中scanf函数和gets函数在输入字符串时的区别
- scanf(), getchar(), 以及gets(),空白符以及输入缓冲区的问题
- C语言 scanf()和gets()函数的区别
- 极好!清晰简洁!scanf()与gets在输入时差别 printf与puts在输出时差别
- C语言 gets()和scanf()函数的区别