一 C中的字符串读取函数:
1 单个字符读取和输出函数:
读取:
int fgetc(FiLE *stream) #注意返回值是该字符的int类型的值。
int getc(FILE *stream) #同上,getc和fgetc相似,只是getc通常实现为宏,更加高效。
int getchar(void) #getchar等价于getc(stdin),getchar也通常实现为宏。
输出:
int fputc(int c,FILE *stream)
int putc(int c,FILE *stream)
int putchar(int c)
2 字符串的读取和输出
读取:
char *fgets(char *s,int n,FILE *stream)
说明:函数fgets带有三个参数:字符数组开头的指针s、数字n和输入流。
字符从输入流读取到s中,直到遇到换行符、到达文件末尾(EOF)或已经去读n-1个字符而没有遇到换行符或到达文件末尾(遇到空格不结束)。
如果因为输入换行符而终止输入,则换行符存放在数组中终止null字符前面。
char *gets(char *s)
函数gets从标准输入流stdin读取字符到字符数组s中。与fgets不同的是,换行符终止输入时,gets放弃换行符,不把它放到s中。
使用gets是很危险的,因为输入长度可能超过字符数组中的可用的存储空间。而fgets更安全,因为s中最多只能存放进n个字符。
输出:
int fputs(const char *s,FILE * stream)
说明:fputs的参数为一个以null终止的字符串和一个输出流。将字符串中的所有字符写入到输出流中,不包括null终止字符。
int puts(const char *s)
说明:puts与fputs相似,但字符总是写入到标准输出流stdout。s中的字符写出之后,再写入一个换行符(不管s中是否包含换行符)。
3 fscanf函数、fprintf函数、scanf函数、printf函数、sscanf函数、sprintf函数和snprintf函数
fscanf和scanf忽略输入前面的空白字符,而gets、fgets和getline不忽略。
输入:
#include<stdio.h>
int fscanf(FILE * stream,const char *format,...)
int scanf(const char *format,...)
int sscanf(const char *str,const char *format,...)
函数fscanf分析格式化输入文本,从第一个参数指定的数据流读取字符并根据控制字符串格式转换字符序列。根据控制字符串的内容,可能还需要其他参数。
函数scanf与fscanf和sscanf相似。对于scanf,从标准输入流stdin读取字符;对于sscanf,则是从字符串s读取字符。
总原则:转换操作处理字符,知道(a)到达文件末尾;(b)遇到空白字符或另一个不适合的字符;(3)从转换操作读取的字符数等于指定的最大字段宽度。
例如:对于scanf(“%d”,&a);输入:123aa,则a的结果为123;输入123 45,则a的结果为123。
输出:
#include<stdio.h>
int fprintf(FILE * stream,const char *format,...)
int printf(const char *format,...)
int sprintf(const char *str,const char *format,...)
int snprintf(const char *str,size_t size,const char *format,...)
函数sprintf把输出字符残放在字符串缓冲区s中。输出控制字符串指定的所有字符之后。最后的null字符输出到s中。编程人员要负责保证sprintf的目标字符串存储区足够大,能够包含格式化操作产生的输出。
函数snprintf:write at most size bytes (including the trailing null byte(' \0 ')) to str。
4 getline函数和getdelim函数
#include<stdio.h>
ssize_t getline(char ** lineptr, size_t *n,FILE *stream);
ssize_t getdelim(char **lineptr,size_t *n,int delim,FILE *stream);
在c++中命名空间std内业提供了一个getline函数:std::getline()。
说明:该函数读取所有字符,包括开头的空格符,直到遇到分行符号或EOF。分行符号可以指定,缺省状况下分行符号为newline符号。
例如:
getline(std::cin,s)
getline(std::cin,s,' : ')//for each token separated by ':'