更新时间:2022-06-28 07:12:47
引言:假设想把一个字符串读到程序中。必须首先预留存储字符串的空间。然后使用输入函数来获取这个字符串。
读取字符串输入的第一件事是建立一个空间以存放读入的字符串。
char *name;
scanf("%s", name);
这段代码尽管可能通过编译,但由于name能够指向不论什么地方,所以它的输入值可能覆盖曾经name所指位置的值。
解决的方法是声明一个固定大小的字符数组,或者使用C库里的分配存储空间的函数。
1、gets函数从系统标准输入获得一个字符串。读取字符串直到遇到一个换行符(\n)。它读取换行符之前的全部字符。在这些字符后加入一个空字符(\0),然后把这个字符串交给调用它的程序。它把读取的换行符直接丢弃。而不是把它放入字符串中,这与以下讨论的fgets函数不同,以下再给出样例证明这一点。
#include <stdio.h>
char *gets(char *s);
演示样例:
#include <stdio.h> #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){ …… }
a、它须要第二个參数来说明组大读入字符数。
假设这个參数值为n,fgets()就会读取最多n-1个字符或者读完一个换行符为止。
b、假设fgets读取到换行符。就会把它存放在字符串里。而不是像gets()那样丢弃它。也就是说它在字符串的最后存放的是换行符(\n),而不是空字符(\0)。
c、它还须要第三个參数来说明读哪一个文件。
#include <stdio.h>
char *fgets(char *s, int size, FILE *strem);
演示样例
#include <stdio.h> #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()和gets()两个函数对于换行符不同处理的演示样例证明:
#include <stdio.h> #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)){<span style="white-space:pre"> </span>/*比較两个字符串,由于gets会在最后将\n改为\0存入字符串,而fgets会直接将\n存入字符串*/ printf("name1 is not equal name2\n"); } return 0; }
#include <stdio.h> 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.
本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5141676.html,如需转载请自行联系原作者