首先这4个函数都是获取输入数据的接口,且容我一一道来
1.char *gets(char *str)
功能:从标准输入获取string
从标准输入读取字符,并作为string存入参数str中,在遇到换行符'\n'或EOF(文件结束符)时停止读取。'\0'会自动追加到最后一个字符之后。
NOTE:gets跟fgets的一些区别:1)'\n'不会包含在str中,而fgets的会
2)gets没有提供机制让你设定有多少个字符会被读入,而fgets会,因此使用gets的时候,要注意str指向的buffer是否会溢出。
参数:str
指向用来存取C string的buffer的指针
返回值:
成功,返回str字符串
如果没有读取任何字符就遇到了EOF,那么str保持不变,并返回NULL指针
失败,返回NULL指针
可以用ferror和feof来检查是什么原因导致NULL指针的返回。
/*
* File: main.cpp
* Author: Carl
*
* Created on 2012年9月6日, 下午9:03
*/
#include <cstdlib>
#include <cstdio>
int test_gets()
{
char string[20] = {0};
printf("Insert your full address:");
gets(string);
printf("Your address is: %s\n", string);//注意最后的'\n'符,否则输出不会换行的哦
return 0;
}
int main(int argc, char** argv)
{
test_gets();
return 0;
}
g++ main.cpp 得到可执行文件a.out
$./a.out
执行如下
[carl@Fedora test_stdio]$ ./a.out
Insert your full address:hello
Your address is: hello
[carl@Fedora test_stdio]$ ./a.out
Insert your full address:kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
Your address is: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
Segmentation fault
2.char *fgets(char *str, int num, FILE *stream);
功能:从stream中读取字符,并作为C string存入到str中,在读取num-1个字符,或遇到'\n'、EOF时,停止读取,3个条件满足一个就立即停止
NOTE:‘\n'使fgets停止读取,并被认作合法字符,包含在str中,'\0'会被自动追加到最后一个读取的字符之后。
参数:
str: 指向用来存放string的char数组的指针
num:被读取的最大字符数目(包括'\0'字符),通常用str数组的长度
stream:指针,指向一个FILE对象,fgets从这个对象中读取字符。要从标准输入读取,可用stdin作为实参。
返回值:
成功,返回str字符串
如果没有读取任何字符就遇到了EOF,那么str保持不变,并返回NULL指针
失败,返回NULL指针
可以用ferror和feof来检查是什么原因导致NULL指针的返回。
#include <cstdlib>
#include <cstdio>
int test_fgets()
{
FILE *pFile = NULL;
char mystring[25] = {0};
pFile = fopen("myfile.txt", "r");
if (pFile == NULL)
{
perror("Error opening file");
}
else
{
if (fgets(mystring, sizeof(mystring), pFile) != NULL)
{
puts(mystring);
}
fclose(pFile);
}
return 0;
}
int main(int argc, char** argv)
{
test_fgets();
return 0;
}
g++ main.cpp
如果我的myfile.txt如下
this is
the first line
this is the 2nd line
this is the 3rd line
执行结果为:
[carl@Fedora test_stdio]$ ./a.out
this is
[carl@Fedora test_stdio]$
如果myfile.txt如下:
this is the first line
this is the 2nd line
this is the 3rd line
执行结果如下
[carl@Fedora test_stdio]$ ./a.out
this is the first line
[carl@Fedora test_stdio]$
跟gets比起来,fgets可以在第2个参数设置最多可读入的字符数,有效防止溢出,更安全一点
3.int getchar(void); //注意函数类型为int哦,不是char哦
功能:返回从标准输入的下一个字符
参数:无
返回值:
字符作为一个int型值被返回
如果遇到EOF或者读取错误,函数返回EOF,并且相应的error或EOF标识被设置。可以用ferror和feof来检查是读取错误还是遇到EOF
/*
* File: main.cpp
* Author: Carl
*
* Created on 2012年9月6日, 下午9:03
*/
#include <cstdlib>
#include <cstdio>
int test_getchar()
{
char c;
puts("Enter text. Include a dot('.') in a sentence to exit:");
do
{
c = getchar();
putchar(c);
} while(c != '.');
putchar('\n');
return 0;
}
int main(int argc, char** argv)
{
test_getchar();
return 0;
}
g++ main.cpp
执行结果如下
[carl@Fedora test_stdio]$ ./a.out
Enter text. Include a dot('.') in a sentence to exit:
hello world.
hello world.
[carl@Fedora test_stdio]$ ./a.out
Enter text. Include a dot('.') in a sentence to exit:
hello world.kjdksjalkfsaldsjljfksk;samsjljsaljfjsajaslaskdsa......
hello world.
[carl@Fedora test_stdio]$ ./a.out
Enter text. Include a dot('.') in a sentence to exit:
h
h
lo
lo
.
.
[carl@Fedora test_stdio]$ ./a.out
Enter text. Include a dot('.') in a sentence to exit:
hello world.
hello world.
[carl@Fedora test_stdio]$ ./a.out
Enter text. Include a dot('.') in a sentence to exit:
hello world.helkdksaksaklksajsaf
hello world.
[carl@Fedora test_stdio]$ h
-bash: h: command not found
[carl@Fedora test_stdio]$ ./a.out
Enter text. Include a dot('.') in a sentence to exit:
hel
hel
llo
llo
.
.
[carl@Fedora test_stdio]$
4.int scanf(const char *format, ...);
功能:从标准输入读入格式化数据
从标准输入读入数据,并根据format参数指明的格式来存取到另一个参数所指定的位置。该“另外的参数”应该执行已经分配了内存空间的对象,并且对象类型与format中的格式标识想匹配。
参数:
format
1)空白字符:该函数会读取并忽略掉下一个非空字符之前的任何空白字符(包括空格,tab,换行符),任意个或者零个
2)非空字符,除了%:非空白符和格式标示符(%开头的)的任意字符会使函数从标准输入读取下一个字符,并与该非空字符比较,如果相同,则丢弃掉,函数继续根据format进行读取,否则函数失败,返回,并保留一个从标准输入未读取的字串
3)格式标示符:以%开头的,用来表示数据的类型与格式。格式标示符遵循协议:%[*][width][modifier]type
where:
* | 一个可选的星号,表示数据可以从标准输入获取,但被忽略。例如,它不会被存在相关的参数中。 |
width | 指明当前读取选项可读取的最大数目的字符数 |
modifiers | 指定一个跟int,unsigned int,float不同的size: h : short int (for d, i and n), orunsigned short int (foro,u andx) l : long int (for d, i and n), orunsigned long int (foro,u andx), or double (fore, f andg) L : long double (for e, f and g) |
type | 一个字符,指定了数据类型 |
scanf 类型标示符:
类型 | 说明 | 参数类型 |
---|---|---|
c | 单个字符,不会自动追加'\0' | char * |
d | 十进制整数:可加+ - 前缀 | int * |
e,E,f,g,G | 浮点型:含小数点的十进制整数,可选+ -前缀,可选e/E加一个十进制数,例如-732.103,7.12e4 | float * |
o | 八进制整数 | int * |
s | 字符串:读取一系列字符,遇到空白符停止,空白符包括:空格,换行,tab | char * |
u | 无符号十进制整数 | unsigned int * |
x,X | 十六进制整数 | int * |
该函数需要一系列引用作为附加参数,每一个指向一个类型与%-tag匹配的对象。
int n;
scanf("%d", &n);
返回值:
成功,返回成功读取的对象数目,这个数据跟期待数目会相同,或者遇到匹配失败会比期待的数目要少
如果一个都没读到就读取失败了,EOF就会被返回。
/*
* File: main.cpp
* Author: Carl
*
* Created on 2012年9月6日, 下午9:03
*/
#include <cstdlib>
#include <cstdio>
int test_scanf()
{
char str[80];
int i;
printf("Enter your family name: ");
scanf("%s", str); //str可看成一个指针
printf("Enter your age: ");
scanf("%d", &i);
printf("Mr. %s , %d years old.\n", str, i);
printf("Enter a hexadecimal number: ");
scanf("%x", &i);
printf("You have entered %#x (%d).\n", i, i);
return 0;
}
int main(int argc, char** argv)
{
test_scanf();
return 0;
}
g++ main.cpp
执行结果:
[carl@Fedora test_stdio]$ g++ main.cpp
[carl@Fedora test_stdio]$ ./a.out
Enter your family name: wang
Enter your age: 26
Mr. wang , 26 years old.
Enter a hexadecimal number: ff
You have entered 0xff (255).
[carl@Fedora test_stdio]$