scanf fgets gets qsort

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);   

}

 

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值