1.scanf()函数
c库的输入函数有多个,如scanf,gets,fgets,getchar。
scanf和printf是C语言中较为常用的输入输出函数,这两个函数的参数是不确定的,编译器也没有办法进行检查,因此用的时候挺容易报错,下面就总结一下scanf()函数的用法
scanf()函数的参数分为两部分,一部分为转换字符,另一部分为要传入的变量的地址,除数组外其他的都需要加地址符&
。举栗子:
scanf中的类型转换符
scanf的转换字符与printf的转换字符相同,scanf是把输入的数据转换为对应的类型存入目标变量的地址,printf是把数据转化为对应的类型输出。详情见printf()转换字符总结。
scanf中的*修饰符
scanf中的*修饰符与printf中的*修饰符不同,scanf中的*修饰符用在%和转换字符之间 , 用于跳过该输入项,举栗子:
scanf中使用字段宽度 ,举个栗子:
格式字符串中的普通字符串:
scanf函数允许将普通字符添加在格式字符串中,比如在转换说明中添加一个逗号,举栗子:
scanf的返回值:
scanf函数返回成功读取的参数个数,举栗子:
2:getline()函数
cin在输入空格的时候会自动结束输入。相比之下,getline的优点就是在输入字符串的时候可以输入空格。
用法一:getline()
该函数可读取键盘输入的任意长度,遇见回车或换行符结束,不读取换行符,delim由自己设定。可读取整行,包括前导和插入的空格,并将其存入字符串对象中。
在使用getline函数读取整行函数时,若前面有getchar(),cin这类函数读入字符时,其产生的后续换行符\n,再接getline()函数就会产生错误,这是因为敲回车所产生的换行符\n仍滞留在输入流,直接就被getline(cin,s)给读进去了,此时的s="\n",所以实际上s只读入了一个换行符就结束了(事实上是不读取换行符的,实际是遇到换行符直接就寄了)。
举栗子:
用法二: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’前面出现的字符的个数
比如:
若在字符串前加 "\00"则返回0
6:sizeof函数
sizeof函数也是计算字符串长度的函数,但它能把'\0'也计算进去,并且若字符串开头有'\0'也不会像strlen函数一样发生截断,比较安全的函数。
如栗子:
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函数使用形式:
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加了限制小数点后的有效数字,不加则是整个变量的有效数字。
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
Comments | NOTHING