c各类函数原理及使用

发布于 2022-08-01  378 次阅读


1.scanf()函数

c库的输入函数有多个,如scanf,gets,fgets,getchar。

scanf和printf是C语言中较为常用的输入输出函数,这两个函数的参数是不确定的,编译器也没有办法进行检查,因此用的时候挺容易报错,下面就总结一下scanf()函数的用法

scanf()函数的参数分为两部分,一部分为转换字符,另一部分为要传入的变量的地址,除数组外其他的都需要加地址符&。举栗子:

因为字符串是char类型的数组,所以不用加取地址符。
因为数组名就是数组中第一个元素的地址,而其他的变量名并没有这种作用,所以需要加取地址符。

scanf中的类型转换符

scanf的转换字符与printf的转换字符相同,scanf是把输入的数据转换为对应的类型存入目标变量的地址,printf是把数据转化为对应的类型输出。详情见printf()转换字符总结

scanf中的*修饰符

scanf中的*修饰符与printf中的*修饰符不同,scanf中的*修饰符用在%和转换字符之间 , 用于跳过该输入项,举栗子:

设输入1,2,3,则n的值为3,跳过了前俩个的输入。

scanf中使用字段宽度 ,举个栗子:

输入123 4,则会输出 a=12,b=3。

格式字符串中的普通字符串:

scanf函数允许将普通字符添加在格式字符串中,比如在转换说明中添加一个逗号,举栗子:

用户输入一个整数型再输入一个逗号再输入一个整数型。所以必须输入这样的 1,2或者1,(回车)2。
若想这样写则:

scanf的返回值:

scanf函数返回成功读取的参数个数,举栗子:

2:getline()函数

cin在输入空格的时候会自动结束输入。相比之下,getline的优点就是在输入字符串的时候可以输入空格。

用法一:getline()

cin是标准输入流函数
temp是用来存储字符的变量名
delim是结束标志

该函数可读取键盘输入的任意长度,遇见回车或换行符结束,不读取换行符,delim由自己设定。可读取整行,包括前导和插入的空格,并将其存入字符串对象中。

在使用getline函数读取整行函数时,若前面有getchar(),cin这类函数读入字符时,其产生的后续换行符\n,再接getline()函数就会产生错误,这是因为敲回车所产生的换行符\n仍滞留在输入流,直接就被getline(cin,s)给读进去了,此时的s="\n",所以实际上s只读入了一个换行符就结束了(事实上是不读取换行符的,实际是遇到换行符直接就寄了)。

举栗子:

用法二:cin.getline()

s是一个字符数组,n是数组容量,delim是结束标志(默认为换行符)。

举栗子:

注意事项
getline()是string流的函数,只能用于string类型的输入操作。当你定义了一个string类型变量,只能用getline()来输入。
cin.getline是std流的函数,用于char类型的输入操作。当你

定义了一个char类型变量,只能用cin.getline()输入。

ctf中的简单应用:

摘取大写字母或小写字母

#include<iostream>
using namespace std;
int main()
{
string s;
getline(cin,s);
for (int i=0;i<s.size();i++)
{
    if(s[i]>='A'&&s[i]<='Z')
    cout<<s[i]<<" ";
}


system("pause");
    return 0;
}

3:memcpy函数

memcpy是memory copy的缩写,意为内存复制,函数原型为void *memcpy(void *dest, const void *src, size_t n);

功能是从指针src所指的地址拷贝n个字节的数据到指针dest所指的地址。如果原本dest所指的地址含有数据,则会被覆盖。memcpy函数的返回值是dest的指针。memcpy函数定义在string.h头文件里。

4:取模(mod)与取余(rem)的区别

取模运算也叫取余运算,返回结果都是余数。但还是有区别的,

rem(x,y)和mod(x,y),当x和y的正负号一样的时候,两个函数结果是一样的;当x和y的符号不同时,rem函数结果的符号和x的一样,而mod和y一样。这是由于两个函数的生成机制不同,rem函数采用fix函数,而mod函数采用了floor函数,(这两个函数是用来取整的,fix函数向0方向舍入,floor函数向无穷小方向舍入)。

rem(x,y)命令返回的是x-n.*y,如果y不等于0,其中的n = fix(x./y),而mod(x,y)返回的是x-n.*y,当y不等于0时,n=floor(x./y)

两个异号整数取模取值规律

先将两个整数看作是正数,再作除法运算
①能整除时,其值为0
②不能整除时,其值=除数×(整商+1)-被除数

例:mod(36,-10)=-4
即:36除以10的整数商为3,加1后为4;其与除数之积为40;再与被数之差为(40-36=4);取除数的符号。所以值为-4。
例:mod(9,1.2)=0.6; 

例:
>> mod(5,2)
ans =1                   %“除数”是正,“余数”就是正
>> mod(-5,2)
ans =1
>> mod(5,-2)
ans =-1                  %“除数”是负,“余数‘就是负
>> mod(-5,-2)
ans =-1                  %用rem时,不管“除数”是正是负,“余数”的符号与“被除数”的符号相同
>> rem(5,2)
ans =1                   %“被除数”是正,“余数”就是正
>> rem(5,-2); 
ans =1
>> rem(-5,2)
ans =-1                 %“被除数”是负,“余数”就是负
>> rem(-5,-2)
ans =-1

5:strlen函数

strlen函数返回的是在字符串中’\0’前面出现的字符的个数

比如:

此时返回的就是5,不包括末尾的 '\0'

若在字符串前加 "\00"则返回0

因此有时候可以在字符串前加一个'\0'来绕过某些判断,但有时候不能直接加'\0',这就需要转义字符了,\为转义字符,’\xhh‘表示ASCII码值与’hh’这个十六进制数相等的符号,例如’\xff’表示ASCII码为255的符号。

6:sizeof函数

sizeof函数也是计算字符串长度的函数,但它能把'\0'也计算进去,并且若字符串开头有'\0'也不会像strlen函数一样发生截断,比较安全的函数。

如栗子:

字符串前加’\0‘

7:a.size()函数

同strlen,sizeof函数类似,计算长度的,只不过a.size()函数针对string类型的,而上两种针对char类型的,a.size()函数和strlen函数一样不计算'\0',并且若字符串开头有'\0'也会发生截断

栗子:

字符串前加'\0'

8:strncmp函数与strcmp函数的区别

int strncmp(const char *str1, const char *str2, int n);

三个参数,前两个为char类型字符串,n为比较的字符个数。strncmp(  )首先将str1第一个字符值减去str2第一个字符值。若差值为0继续比较,直到字符结束标志'\0';若差值不为0,则将差值返回。如 str1=Aa str2=bB 进行比较差值为-33,则比较结束返回差值。注意:要比较的字符包括字符串结束标志'\0',而且一旦遇到'\0'就结束比较

int strcmp( const char *str1 , const char *str2 )

strcmp函数与strncmp函数的主要区别就是能否比较指定字符长度

####

####

9:malloc函数的用法

当我们需要做一个成绩管理系统,人数可能为全校学生,也可能为一个班的学生,当我们开辟一个班的数组大小时,如果要存储整个学校的人数时,会出现内存不够用的情况;当我们开辟全校人数大小的数组时,输入一个班人数的大小时,会出现内存浪费的情况。
为了应对上述问题,我们引入malloc函数。

malloc时动态内存分配函数,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址

malloc函数原型 :

意为分配长度为num_bytes字节的内存块

malloc函数头文件:

malloc函数返回值

如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。

malloc函数使用注意事项:

malloc函数的返回的是无类型指针,在使用时一定要强制转换为所需要的类型。

(敲黑板)重点:在使用malloc开辟空间时,使用完成一定要释放空间,如果不释放会造内存泄漏。
在使用malloc函数开辟的空间中,不要进行指针的移动,因为一旦移动之后可能出现申请的空间和释放空间大小的不匹配

malloc函数使用形式

10:read函数的用法

read函数更详细内容请参考:_read | Microsoft Learn

11:memset函数

memset是一个初始化函数,作用是将某一块内存中的全部设置为指定的值。

详情见该博主:(36条消息) memset的用法详解_薛定谔的猫ovo的博客-CSDN博客

12:保留有效数位

c语言中保留n位有效数字

  • 若规定宽度为p,小数q位,用%p.qf输出
  • 若规定整数+小数一共n位有效,用%.ng输出

(42条消息) 洛谷 P5714 【深基3.例7】肥胖问题:保留六位有效数字_c语言保留六位有效数字_小废物~的博客-CSDN博客

setprecision用法:

cout << setprecision(1) << fixed << b << endl;
cout <<setprecision(6)<< q << endl;

fixed加了限制小数点后的有效数字,不加则是整个变量的有效数字。

https://blog.csdn.net/m0_51955470/article/details/118668414?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168285061716782425180978%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168285061716782425180978&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-118668414-null-null.142^v86^koosearch_v1,239^v2^insert_chatgpt&utm_term=setprecision&spm=1018.2226.3001.4187

c库函数strtok():

C 库函数 char *strtok(char *str, const char *delim) 分解字符串 str 为一组字符串,delim 为分隔符。

strtok() 函数的声明: char *strtok(char *str, const char *delim)

两个参数的含义:

  • str -- 要被分解成一组小字符串的字符串。
  • delim -- 包含分隔符的 C 字符串。

返回值:该函数返回被分解的第一个子字符串,如果没有可检索的字符串,则返回一个空指针。

实例:

下面的实例演示了 strtok() 函数的用法。

#include <string.h>
#include <stdio.h>
 
int main () {
   char str[80] = "This is - www.runoob.com - website";
   const char s[2] = "-";
   char *token;
   
   /* 获取第一个子字符串 */
   token = strtok(str, s);
   
   /* 继续获取其他的子字符串 */
   while( token != NULL ) {
      printf( "%s\n", token );
    
      token = strtok(NULL, s);
   }
   
   return(0);
}

输出结果:

This is
www.runoob.com
website

特别要注意分割处理后原字符串 str 会变,变成第一个子字符串,原字符串的改动是切分符原位置均更改为 '\0'

库函数atoi():将字符串转换为整数

atoi() 是 C语言的一个标准库函数,定义在<stdlib.h>头文件中。

具体来讲,atoi() 函数首先会丢弃尽可能多的空白字符,直至找到第一个非空白字符,然后从该字符开始,识别 "+"、"-" 以及 0-9 之间的十进制数,最后将它们转换成整数。如果构成整数的后面还有其它字符,这些字符将会被忽略。

atoi() 函数的原型如下:

int atoi(const char *str);

参数

str:指向要转换的字符串。

返回值

如果转换成功,函数返回转换后的整数。

如果由于 str 为空或者 str 字符串无法转换为整数,函数返回 0。

如果字符串表示的值超出了 int 类型所能表示的整数范围,函数返回的数值是无意义的(垃圾值)。

代码演示:

#include <stdio.h>
#include <stdlib.h>

int main() {
    const char *str1 = "123";
    const char *str2 = "   -123abc12"; // 有效字符是 -123
    const char *str3 = "abc"; // 无效的整数表示

    int value1 = atoi(str1);
    int value2 = atoi(str2);
    int value3 = atoi(str3); // 未定义的结果,通常为0

    printf("Value of str1: %d\n", value1);
    printf("Value of str2: %d\n", value2);
    printf("Value of str3: %d\n", value3); // 可能打印0

    return 0;
}

上述代码将转换三个字符串,前两个包含有效的整数表示,最后一个包含无效表示。通常的结果为:

Value of str1: 123
Value of str2: -123
Value of str3: 0


穿过云层我试着努力向你奔跑