c语⾔gets循环输⼊字符串,【C语⾔⽇⽇练(⼗五)】字符串
输⼊函数fgets、gets和。。。
【C语⾔天天练(⼗五)】字符串输⼊函数fgets、gets和scanf
引⾔:如果想把⼀个字符串读到程序中,必须⾸先预留存储字符串的空间,然后使⽤输⼊函数来获取这个字符串。
读取字符串输⼊的第⼀件事是建⽴⼀个空间以存放读⼊的字符串。
char *name;
scanf("%s", name);
这段代码虽然可能通过编译,但因为name可以指向任何地⽅,所以它的输⼊值可能覆盖以前name所指位置的值。
解决办法是声明⼀个固定⼤⼩的字符数组,或者使⽤C库⾥的分配存储空间的函数。
1、gets函数从系统标准输⼊获得⼀个字符串,读取字符串直到遇到⼀个换⾏符(\n),它读取换⾏符之前
的所有字符,在这些字符后添加⼀个空字符(\0),然后把这个字符串交给调⽤它的程序。它把读取的换⾏符直接丢弃,⽽不是把它放⼊字符串中,这与下⾯讨论的fgets函数不同,下⾯再给出例⼦证明这⼀点。
#include
char *gets(char *s);
⽰例:
#include
#define MAX 18
int
main(int argc, char **argv)
{
char name[MAX];
char *ptr;
printf("what't your name?\n");
ptr = gets(name);/*注意:gets()返回的指针与传递给它的是同⼀个指针*/
printf("%s? Ah ! %s\n", ptr, name);
return 0;
}
注意,如果gets出错时它返回⼀个空地址,因此在使⽤时⼀般使⽤如下技巧:
while((ptr = gets(name)) != NULL){
……
}
2、gets函数的⼀个不⾜是它不检查预留存储区是否能够容纳实际输⼊的数据。多出来的字符简单地溢
出到相邻的内存区。fgets()函数改进了这个问题。它可以指定最⼤读⼊字符数。fgets()和gets()有3点不同:
a、它需要第⼆个参数来说明组⼤读⼊字符数。如果这个参数值为n,fgets()就会读取最多n-1个字符或者读完⼀个换⾏符为⽌。
b、如果fgets读取到换⾏符,就会把它存放在字符串⾥,⽽不是像gets()那样丢弃它。也就是说它在字符串的最后存放的是换⾏符(\n),⽽不是空字符(\0)。
c、它还需要第三个参数来说明读哪⼀个⽂件。
#include
char *fgets(char *s, int size, FILE *strem);
⽰例
#include
#define MAX 18
int
main(int argc, char **argv)
{
char name[MAX];
char *ptr;
printf("what't your name?\n");
ptr = fgets(name, MAX, stdin);
printf("%s? Ah ! %s\n", ptr, name);
return 0;
}编译测试结果显⽰:
what't your name?
libing
libing
Ah ! libing它显⽰了fgets()的⼀个不⾜之处,fgets()把换⾏符存储到字符串⾥了,这样每次显⽰字符串时就会显⽰换⾏符。fgets和fgetc的区别
下⾯对fgets()和gets()两个函数对于换⾏符不同处理的⽰例证明:
#include
#define MAX 18
int
main(int argc, char **argv)
{
char name1[MAX];
char name2[MAX];
char *ptr;
printf("what't your name?\n");
ptr = fgets(name1, MAX, stdin);
ptr = gets(name2);
if(strcmp(name1, name2)){/*⽐较两个字符串,因为gets会在最后将\n改为\0存⼊字符串,⽽fgets会直接将\n存⼊字符串*/
printf("name1 is not equal name2\n");
}
return 0;
}3、scanf()和gets()主要的差别在于它们如果决定字符串何时结束。scanf()更给予获取单词⽽不是获取字符串;⽽gets()函数,会读取所有的字符,直到遇到第⼀个换⾏符为⽌。scanf()使⽤两种⽅法决定输⼊结束,如果使⽤%s格式,字符串读到下⼀个空⽩字符。如果指定了字段宽度,⽐如%10s,scanf()就会读⼊10个字符或直到遇到第⼀个空⽩字符,由⼆者中最先满⾜的哪⼀个终⽌输⼊。
#include
int
main(void)
{
char name1[11], name2[11];
int count;
while(1){
printf("please input 2 names.\n");
count = scanf("%5s %10s", name1, name2);
printf("I read the %d names %s and %s.\n"
,count, name1, name2);
}
return 0;
}运⾏执⾏测试:
please input 2 names.
Jesse Jukes
I read the 2 names Jesse and Jukes.
please input 2 names.
Liza Applebottham
I read the 2 names Liza and Applebotth.
please input 2 names.
Portensia Callowit
I read the 2 names am and Portensia.
please input 2 names.
I read the 2 names Callo and wit.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论