1. scanf
用scanf获取一行字符串包括空格的以及C语言函数其内容为
#include<stdio.h>
int main(){
char str[1024];
scanf("%[^\n]", &str);
return 0;
}
说明:在scanf函数中, 可以使用%c来读取一个字符, 使用%s读取一个字符串, 但是读取字符串时不忽略空格,读字符串时忽略开始的空格,并且读到空格为止,因此只能读取一个单词,而不是整行字符串,因此一般使用fgets来读取一个字符串。
其实scanf函数也可完成这样的功能,而且还更强大。这里主要介绍一个参数,%[ ],这个参数的意义是读入一个字符集合。
[ ]是个集合的标志,因此%[ ]特指读入此集合所限定的那些字符,比如%[A-Z]是输入大写字母,一旦遇到不在此集合的字符便停止。如果集合的第一个字符是"^", 这说明读取不在 "^" 后面集合的字符,即遇到 "^" 后面集合的字符便停止.
注意此时读入的字符串是可以含有空格的。 在这里主要是想说明一点: 如果要循环的从屏幕上读取一行的话,就要在读取一行后,在用%c读取一个字符,将输入缓冲区中的换行符给读出来。否则的话,在下一次读取一行的时候,第一个就遇到'\n',匹配不成功就直接返回了
while(scanf("%[^\n]",str) != EOF) printf("%s\n",str);
str里不保留每一行的换行符 \n
2. gets
从标准输入读取,即stdin。
可以使用gets函数:
char * gets(char *str);
该函数会从标准输入中读取一行数据,直到读到\n,并将\n替换为字符串结束符\0,读取到的数据以字符串形式存于str中。
需要注意的是,使用gets函数时,需要确保str指向空间大小,必须超过任意一行的长度,否则会出现越界操作。有些编译器会报gets是不安全的,就是这个原因。
3.fgets
从文件读取。
对于一个被打开的文件,如果其是可读的,那么可以通过fgets函数实现按行读取。
char *fgets(char *buf, int bufsize, FILE *fp);
功能与gets类似,只是源不同。fgets从fp中读一行数据存到buf中,同时会判断bufsize,如果一行数据的长度超过了bufsize,那么只读入bufsize长度的数据,确保不会溢出。否则读取整行。
由于在C语言中,标准输入stdin也是以文件指针形式存在的,所以gets可以用
fgets(str, bufsize, stdin);
替代,这样代码量稍多一些,但可以更安全。
按行读取:
while(fgets(str,512,stdin) != NULL) printf("%s",str);
str里保留每一行 结尾的 换行符 \n
So it may return NULL
without generating an error in the event of reaching end-of-file. You may need to see ferror
return value to be sure about it.
Please note fgets()
will automatically append a null character (\0
) to the end of the string, which may cause the string to be truncated, since you specify how many characters must be read. The call won't fail if a string with more than length
characters is found.
fread
readn = fread(buf, sizeof(char), sizeof(buf), fp);
fread返回实际读到的字节数,所以当信号中断时,读到的字节都能返回回来,不会丢失。
- If you want to read a line, from a text file, then use
fgets
- If you want to read some data (not necessarily a line) from a file, then use
fread
.
4. qsort
cmp函数入参转换成什么类型呢? 就是在元素的类型上加一级指针。
比如对int set[20][4]排序,按照每行第一个元素大小排列。 那么元素是 int *, qsort(set, 20, 4*sizeof(int), cmp);
int cmp(const void* a, const void* b){
int * aa = *(int **)a;
int *bb = *(int **)b;
return aa[0] - bb[0];
}
2) 比如对
char **set = malloc(20* sizeof(char *));
for(i =0; i< 20; i++)
set[i] = malloc(4);
,对set 各字符串排序。 那么元素是char *, qsort(set, 20, sizeof(char*), cmp); 注意这里是sizeof(char *)
int cmp(const void* a, const void* b){
char* aa = *(char**)a;
char* bb = *(char**)b;
return strcmp(aa,bb);
}