C or C++常用函数库-conio.h、stdio.h、stdlib.h、string.h

常用函数

conio.h

注意:这个头文件是 Windows 特有的

getch()

  • int getch(void)

    无回显无缓冲区输入单个字符。输入一个字符后会立即读取,不用按下回车键。

    (回显:用户输入的字符直接显示在屏幕上。无回显:输入后不会显示用户输入的字符,就好像根本没有输入一样。)

    回显在大部分情况下是有必要的,它能够与用户及时交互,让用户清楚地看到自己输入的内容。但在某些特殊情况下,我们却不希望有回显,例如输入密码,有回显是非常危险的,容易被偷窥。

getche()

  • int getche(void) 回显【echo】

    回显无缓冲输入单个字符。输入一个字符后会立即读取,不用按下回车键。

stdio.h

puts()

  • int puts(char *str)

    只显示字符串,并自动在显示的字符串末尾加上换行符。该函数在遇到空字符(\0)时结束输出。

gets()

  • char *gets(char *str)

    将读取的字符串填充至str中,遇到换行符时结束;

    特殊情况:如只输入一个换行符,gets()也不会将换行符填入str中(若本身str未初始化,那么经过该操作后,str仍然处于未初始化状态)

    缺点:gets() 函数不进行边界检查(在某些编译器可能会发出警告),如果输入的字符串过长,即多余的字符超出了指定的目标空间,这些字符有可能会擦写掉程序中的其他数据,过去,有的人利用该特性插入一些破坏系统安全的代码,因此在C99标准中建议不要使用(保留gets()是为了保证现有使用gets()的程序还能正常运行),然而在C11标准中,直接剔除了gets()函数。

fgets()

  • char *fgets(char *str, int count, FILE *stream)

    有指定范围的读取字符串到str中,且允许指定读取的来源, 遇换行符结束(换行符也能被读取并存储)

    • 第二个参数指明读入字符的最大数量,如果该参数为n,则读入n-1个字符(剩余字符留在输入流中),或者读到第一个换行符为止。
    • 第三个参数指明要读取的文件,如果是读取从键盘输入的,则以stdin作为参数

与gets()不同点,fgets()不会丢弃换行符,会把他存储在字符串中(空间足够时);

fputs()

  • int fputs(const char *str, FILE *stream)

    只显示字符串,末尾不加换行符;第二个参数为输出文件,如果要显示在计算机屏幕上,应该使用stdout为参数。

    fputs函数是puts针对文件定制的版本。

gets_s()

  • char *gets_s(char *str, size_t n)

    gets_s()和fgets()的区别:

    (1)gets_s()只从标准输入中读取数据,所以不需要第3个参数;

    (2)如果gets_s()读到换行符,会丢弃它而不是存储它;这里和gets()函数几乎一样,完全可以用gets_s()替换gets()。

    (3)如果gets_s()读到最大字符数都没有读到换行符或文件结尾,会执行以下几步。首先把目标函数数组中的首字符设置为空字符,读取并丢弃随后的输入直至读到换行符或文件结尾,然后返回空指针。接着,调用依赖实现的“处理函数”(或你选择的其他函数),可能会中止或退出程序。

    使用gets()函数不安全,它会擦除现有数据,存在安全隐患。gets_s()函数很安全,但是,如果并不希望程序终止或退出,就要知道如何编写特殊的“处理函数”。所以当输入与预期不符时,gets_s()完全没有fgets()函数灵活、方便。鉴于此,fgets()通常是处理类似情况的最佳选择。

s_gets()

  • 该函数是用户定义的函数,在stdio.h中并不存在,在这里出现只是为了解决以下问题

    读取整行输入并用空字符替代换行符,或者读取一部分输入,丢弃其余部分。

    char *s_gets(char *st, int n)
    {
    char *ret_val, *find;
    
    ret_val = fgets(st, n, stdin);
    if(ret_val)
    {
       find=strchr(st,'\n');   //查找换行符
       if(find)                //存在换行符
         *find='\0';
       else                    //若没有换行符,这说明未读取完全部字符串
          while(getchar()!= '\n')
            continue;
    }
    return ret_val;
    }
    

getchar()

  • int getchar(void)

    stdin中读取一个字符,包括不可见字符。

putchar()

  • int putchar(int ch)

    将参数输出到stdout中去,包括不可见字符。

    返回值:成功时返回写入的字符。

sprintf()

  • int sprintf(char *buffer, const char *format, ...)

    该函数与printf类似,但是它是吧数据写入字符串,而不是打印在显示器上,并且和fprintf也不同,fprintf是写入文件指针所指向的文件中,而该函数是写入一个char类型的目标字符串中。

    • 第一个参数是char类型目标数组
    • 第二、三个参数和printf的参数相同,只不过输出位置不同。

stdlib.h

atoi()

  • int atoi(const char *str)

    转译 str 所指的字节字符串中的整数值。

    舍弃任何空白符,直至找到首个非空白符,然后接收尽可能多的字符以组成合法的整数表示,并转换之为整数值。合法的整数值含下列部分:

    • 正(可选)或负号
    • 数位
    int       atoi( const char *str );  //ascii to int
    long      atol( const char *str );    //ascii to long
    long long atoll( const char *str ); //ascii to long long
    

    输入示例:

    123  -> 123       //正常输入
    +123 -> 123
    -123 -> -123
    123sa456 -> 123   //只接收第一段非空数字字符
    sa456 -> 0        //首个非空字符非数字字符
    adfb -> 0
    

free()

  • void free(void *ptr)

    释放ptr指向的空间。

malloc()

  • void malloc(size_t size)

    分配size个字节的未初始化内存块,分配成功返回数组的地址,分配失败返回NULL。

    注意:分配空间后的返回值一定要进行强制类型转换,例如 char *name = (char *)malloc(sizeof(char) * 5);分配五个char类型的空间

string.h

memset()

  • void *memset(void *str, int v, size_t n)

    把v的值转换为unsigned char后拷贝至str指向的前n个字节中。

注意事项:memset(nums, 1, sizeof(nums)),之后nums中的答案不是1,要注意memset是以字节填充数组,因此答案不是1

memset(nums, 0, sizeof(nums))或者memset(nums,-1,sizeof(nums)),答案是0或-1,在32位int中,-1是以1111111····1111(补码)来表示的,因此填充后答案还是-1

memcpy()

  • void *memcpy(void *str, const void *data, size_t n);

    把大小为n的data指向的空间拷贝到str中去。

strlen()

  • size_t strlen(const char *str)

    返回str字符串的字符数。(不包括空字符'\0')

    该函数的实现方法是计算从str地址开始到\0这段空间中字符的个数,因此当字符数组不含空字符时,返回值可能不准确。

strcat()

  • char *strcat(char *restrict str1, const char *restrict str2)

    进行字符串的拼接,在str1的基础上追加str2,返回的是str1的首地址。

    具体实现:将第二个字符串连接到第一个字符串中第一个\0出现的位置。不检查第一个数组的大小是否可以容纳第二个字符串。如果第一个数组的已分配的内存不够容纳第二个字符串,则多出来的字符将会溢出到相邻的内存单元。

strncat()

  • char *strncat(char *restrict str1, const char *restrict str2, size_t count)

    在strcat()的基础基础上增加了字符拼接数量上的限制。即最多只可在str1上追加count个字符。

    详细说明:count是str1中第一个’\0’到最后一个’\0′(不包括最后一个’\0′)的可使用位置个数。strncat()的结束条件为:追加的个数达到限制个数countstr2到达空字符位置(如果未满足限制条件,str2中的空字符也会拼接到str1中去),函数操作结束。

    值得注意的是:如果将str2拼接到str1中去,str1仍有剩余空间,那么str2只是覆盖str1中第一个\0到str2长度的空间,不影响其他位置的数据,例如

    str1[10] = "abcd"; str1[1] = '\0'; str2[2] = "0"; strncat(str1, str2, 5);执行后str1中数据为:str1 = {'a', 'b','\0','d'}

strcmp()

  • int strcmp(const char *str1, const char *str2) 比较【compare】

    strcmp()的参数只能是字符串。该函数比较两个字符串是否相等。相等时返回0,不相等时:依次进行比较,直到达到第一个不同的字符时,若str1的ASCII码大于str2的ASCII码时返回正值,反之返回负值。

    注意:strcmp函数只会比较字符数组中第一个空字符之前的部分。即strcmp比较的是字符串而不是整个字符数组。两个字符串不相等时,返回的非零值不一定是字符串str1和字符串str2的第一个不同的字符的ASCII码的差值。

strncmp()

  • int strncmp(const char *str1, const char *str2, size_t count)

    strcmp()函数比较字符串中的字符时,直到发现不同的字符为止,这一过程可能持续到字符串的末尾。而strncmp()函数进行了改进,可以比较到字符不同的地方,也可以只比较到第三个参数限定的字符数。

    在满足第三个参数限定的范围时,strncmp可以一直进行比较,直到到达第一个不同的字符位置,并按照strcmp的规则返回值。若strncmp的返回值为0,则说明两个字符串前count个字符相同。

strcpy()

  • char *strcpy(char *restrict str1, const char *restrict str2)

    将字符串str2拷贝到字符串str1中,其中str1称为目标字符串,str2称为源字符串。缺点在于该函数不判断目标数组能否容纳原字符串。同时该函数也会拷贝str2所有内容,包括空字符。

    注意:该函数有两个特别的属性

    • 返回值类型为char *,该函数返回的是目标数组str1地址。
    • 第一个参数不必指向数组的开始位置,可以是str1 + x;(x为任意不大于strlen(str1)的正整数)

    举例:

    char *orig = "beast";
    char copy[40] = "Be the best that you can be.";
    char *ps;
    puts(orig); puts(copy);
    ps = strcpy(copy + 7, orig);
    puts(orig); puts(copy);
    

    输出:

    beast 
    Be the best that you can be.
    beast
    Be the beast
    

strncpy()

  • char *strncpy(char *restrict str1, const char *restrict str2, size_t count)

    该函数在strcpy函数的基础上增加了第三个参数,第三个参数指明可拷贝的最大字符数。

    注意:当strlen(str2) > strlen(str1)时,count应该设置为strlen(str1) - 1,并同时将str1最后一个位置设置为空字符。这样做确保了函数执行操作后,str1仍然是一个字符串。

strchr()

  • char *strchr(const char *s, char ch)

    如果s字符串包含ch字符,该函数返回指向s字符串首次出现ch字符的指针(末尾的空字符也是字符串的一部分,所以在查找范围内),如果在字符串s中未找到ch字符,该函数返回空指针。

strrchr()

  • char *strrchr(const char *s, char ch)

    该函数返回s字符串中c字符最后一次出现的位置(末尾的空字符也是字符串的一部分,所以在查找范围内)。如果未找到ch字符,这返回空指针。

strstr()

  • char *strstr(const char *str1, const char *str2)

    返回一个指针,指向str1中首次出现str2子串序列的起始指针,如果未找到,则返回NULL。

作者:WuQiling
文章链接:https://www.wqlblog.cn/c-or-c常用函数库-conio-h、stdio-h、stdlib-h、string-h/
文章采用 CC BY-NC-SA 4.0 协议进行许可,转载请遵循协议
暂无评论

发送评论 编辑评论


				
默认
贴吧
上一篇
下一篇