C函数使用笔记

来源:互联网 发布:人人商城分销 源码 编辑:程序博客网 时间:2024/05/21 19:43

一些C函数使用笔记


  • 一些输入函数的缓冲区问题
    scanf()以Space、Enter、Tab结束一次输入,不会舍弃最后的回车符(即回车符会残留在缓冲区中);
    getchar()以Enter结束输入,也不会舍弃最后的回车符;
    读取字符串时:
    scanf()以Space、Enter、Tab结束一次输入
    gets()以Enter结束输入(空格不结束),接受空格,会舍弃最后的回车符!
    第二:为了避免出现上述问题,必须要清空缓冲区的残留数据,可以用以下的方法解决:
    方法1:C语言里提供了函数清空缓冲区,只要在读数据之前先清空缓冲区就没问题了!
    这个函数是fflush(stdin)。
    方法2:自己取出缓冲区里的残留数据。
    (说实话这个语句我也没看懂,呵呵!为什么格式控制是这样的!希望高手指点一下!)
    scanf(“%[^\n]”,string);

  • void * memset(void * ptr, int value , size_t num);
    从ptr所指的地址开始,填充一块长度为num、内容为value的数据。
    Sets the first num bytes of the block of memory pointed by ptr to the specified value (interpreted as an unsigned char).

int main(){   char str[] = "almost every programmer should know!";   memset(str,'-',3);   puts(str);    return 0;}

结果是前面三个字符被替换成 - - -

  • char * strstr(char * str1, const char * str2);
    str1:被查找目标。 str2:要查找对象。
    返回值:若str2是str1的子串,则返回str2在str1的首次出现的地址;如果str2不是str1的子串,则返回NULL。
char str[]="1234xyz";char *str1=strstr(str,"34");cout << str1 << endl;

显示结果:34xyz 。返回是首次出现的地址。

  • int sprintf(char* buffer, const char* format, [arg]…);
    buffer:char型 指针,指向将要写入的字符串缓冲区。
    format:格式化字符串。
    [arg]…:可选参数,可以是任何类型的数据。
    返回值:写入buffer的字符数,出错则返回-1.如果 buffer 或 format 是空指针,且不出错而继续,函数将返回-1,并且 errno 会被设置为 EINVAL。
    sprintf 返回以format为格式argument为内容组成的结果被写入buffer 的字节数,结束字符‘\0’不计入内。即,如果“Hello”被写入空间足够大的buffer后,函数sprintf 返回5,同时buffer的内容将被改变。
#include <stdio.h>int main( void ){   char  buffer[200], s[] = "computer", c = 'l';   int   i = 35, j;   float fp = 1.7320534f;   // 格式化并打印各种数据到buffer   j  = sprintf( buffer,    "   String:    %s\n", s ); // C4996   j += sprintf( buffer + j, "   Character: %c\n", c ); // C4996   j += sprintf( buffer + j, "   Integer:   %d\n", i ); // C4996   j += sprintf( buffer + j, "   Real:      %f\n", fp );// C4996   printf( "Output:\n%s\ncharacter count = %d\n", buffer, j );}

Output:
String: computer  
Character: l
Integer: 35
Real: 1.732053
character count = 79

%% 印出百分比符号,不转换。
%c 整数转成对应的 ASCII 字元。
%d 整数转成十进位。
%f 倍精确度数字转成浮点数。
%o 整数转成八进位。
%s 整数转成字符串。
%x 整数转成小写十六进位。
%X 整数转成大写十六进位。

strcat 只能连接字符串(一段以’\0’结尾的字符数组或叫做字符缓冲,null-terminated-string),但有时我们有两段字符缓冲区,他们并不是以 ’’结尾。比如许多从第三方库函数中返回的字符数组,从硬件或者网络传输中读进来的字符流,它们未必每一段字符序列后面都有个相应的’’来结尾。如果直接连接,不管是sprintf 还是strcat 肯定会导致非法内存操作,而strncat 也至少要求第一个参数是个null-terminated-string,那该怎么办呢?我们自然会想起前面介绍打印整数和浮点数时可以指定宽度,字符串也一样的。比如:
char a1[] = {‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’};
char a2[] = {‘H’, ‘I’, ‘J’, ‘K’, ‘L’, ‘M’, ‘N’};
如果:
sprintf(s, “%s%s”, a1, a2); //Don’t do that!
十有八九要出问题了。是否可以改成:
sprintf(s, “%7s%7s”, a1, a2);
也没好到哪儿去,正确的应该是:
sprintf(s, “%.7s%.7s”, a1, a2);//产生:”ABCDEFGHIJKLMN”
这可以类比打印浮点数的”%m/nf”,在”%m.ns”中,m 表示占用宽度(字符串长度不足时补空格,超出了则按照实际宽度打印),n 才表示从相应的字符串中最多取用的字符数。通常在打印字符串时m 没什么大用,还是点号后面的n 用的多。自然,也可以前后都只取部分字符:
sprintf(s, “%.6s%.5s”, a1, a2);//产生:”ABCDEFHIJKL”

原创粉丝点击