一、字符串相关函数
1.gets()(输入字符串)
格式:gets(字符串);
(1)区别:gets(str)与scanf(“%s”,str)
gets(str)允许输入的字符串含有空格
scanf(“%s”,str)不允许含有空格
注意:由于以上无法知道字符串大小,很容易导致字符数组越界
2.fgets()(输入字符串)
格式:fgets(char *s, int size, FILE *stream)
s:字符串;
size:指定最大读取字符的长度(size-1)
stream:文件指针,如果读键盘输入的字符串,固定写为stdin
结尾自带"\n".不用担心越界问题
3.puts()(字符串输出)
格式:puts(字符串)
在输出后自动输出一个“\n”
4.fputs()(字符串输出)
格式:fputs(constchar * str, FILE * stream)
s:字符串
stream:文件指针,如果读键盘输入的字符串,固定写为stdin
注意:fputs()是puts()的文件操作版本,但fputs()不会自动输出一个'\n'
5.srelen()(计算指定字符串大小)
格式:strlen(const char *s);
s:字符串首地址
6.strcpy()(把src所指向的字符串复制到dest所指向的空间中,'\0'也会拷贝过去)
格式strcpy(dest, src)
dest:目的字符串首地址
src:源字符首地址
连接后:
注意:如果参数dest所指的内存空间不够大,可能会造成缓冲溢出的错误情况。
7.strncpy()
功能:把src指向字符串的前n个字符复制到dest所指向的空间中,是否拷贝结束符
看指定的长度是否包含'\0'。
格式:strncpy(dest, src, size_t n)
dest:目的字符串首地址
src:源字符首地址
n:指定需要拷贝字符串个数
8.strcat()
功能:将src字符串连接到dest的尾部,‘\0’也会追加过去
格式:strcat(dest, src)
dest:目的字符串首地址
src:源字符首地址
9.strncat()
功能:将src字符串前n个字符连接到dest的尾部,‘\0’也会追加过去
格式:strncat(dest, src, size_t n)
dest:目的字符串首地址
src:源字符首地址
n:指定需要追加字符串个数
10.strcmp()
功能:比较 s1 和 s2 的大小,比较的是字符ASCII码大小
格式:strcmp(s1,s2)
s1:字符串1首地址
s2:字符串2首地址
11.strncmp()
功能:strcmp的追加,比较前n个大小的字符大小,比较的是字符ASCII码大小
格式:strncmp(s1,s2,n)
s1:字符串1首地址
s2:字符串2首地址
n:指定比较字符串的数量
12.sprintf()
功能:格式化数据,然后将结果输出到str指定的空间中,直到出现字符串结束符 '\0' 为止
格式:sprintf(str, format, ...)
str:字符串首地址
format:字符串格式,用法和printf()一样
13.sscanf()
功能:从str指定的字符串读取数据,并根据参数format字符串来转换并格式化数据
格式:sscnf(str, format, ...)
str:指定的字符串首地址
format:字符串格式,用法和scanf()一样
14.strchr()
功能:在字符串s中查找字母c出现的位置
格式:strchr(s, int c)
s:字符串首地址
c:匹配字母(字符)
15.strstr()
功能:查找在字符串riunv中找llunk出现的位置
格式:strstr(riunv,link)
16.strtok()
功能:来将字符串分割成一个个片段。当strtok()在参数s的字符串中发现
参数delim中包含的分割字符时, 则会将该字符改为\0 字符,当连续
出现多个时只替换第一个为\0。
格式:strtok(str, delim)
str:指向欲分割的字符串
delim:为分割字符串中包含的所有字符
注意: 在第一次调用时:strtok()必需给予参数s字符串
往后的调用则将参数s设置成NULL,每次调用成功则返回指向被分割出片段的指针
17.atoi()
功能:atoi()会扫描nptr字符串,跳过前面的空格字符,
直到遇到数字或正负号才开始做转换,而遇到
非数字或字符串结束符('\0')才结束转换,并将结果返回返回值。
格式:atoi(nptr);
nptr:待转换的字符串
拓展(与atoi类似的)
1.atof():把一个小数形式的字符串转化为一个浮点数。
2.atol():将一个字符串转化为long类型
一、函数
1.函数的定义
返回类型 函数名(形式参数列表)
{
数据定义部分;
执行语句部分;
}
2.函数名
可以随意取,但最好见名知意
注意:函数名的后面有个圆换号(),代表这个为函数,不是普通的变量名。
3.形参列表
在定义函数时指定的形参,在未出现函数调用时,它们并不占内存中的存储单元,因此称它们是形式参数或虚拟参数,简称形参,表示它们并不是实际存在的数据,所以,形参里的变量不能赋值。
定义:类型+变量的形式
4.函数体
函数功能实现的过程
5.返回值
函数的返回值是通过函数中的return语句获得
注意:如果函数返回的类型和return语句中表达式的值必须一致,程序则会报错。
课后作业
思考任务(课后练习)
1、设计一个计算器,可以进行加、减、乘、除运算,类型全部都是int即可
要求从键盘输入指令及操作数,如:
add 15 25 //计算15+25的值,并返回结果
sub 25 15 //计算25-15的值,并返回结果
mux 3 5 //计算 3*5的值, 并返回结果
dive 25 5 //计算25/5的值,并返回结果
提示:1) 需要封装函数
2) scanf("%s %d %d", name, a, b);
2、不用使用库函数,编写一个函数my_strcmp(),功能和strcmp()一样,实现字符串大小比较:
int my_strcmp(char s1[], char s2[]);
int main()
{
char s1[] = "hello world";
char s2[] = "hello abc";
int flag = my_strcmp(s1, s2);
if(flag == 0)
{
printf("%s 等于 %s\n", s1, s2);
}
else if(flag > 0)
{
printf("%s 大于 %s\n", s1, s2);
}
else
{
printf("%s 小于 %s\n", s1, s2);
}
return 0;
}
答案
1.
#include<stdio.h>
#include<string.h>
int main()
{ int a=0,b=0; char name[5]; char s2[5]="add"; char s3[5] = "sub"; char s4[5] = "mux"; char s5[5] = "dive"; printf("请输入加add,减sub,乘mux,除dive\n"); gets(name); printf("请输入两个数:\n"); scanf("%d %d", &a, &b); if (strcmp(name, s2) == 0) { printf("%d", a + b); } else if (strcmp(name, s3) == 0) { printf("%d", a - b); } else if (strcmp(name, s4) == 0) { printf("%d", a*b); } else if (strcmp(name, s5) == 0) { printf("%d", a/b); } else { printf("输入出错"); } return 0; }
2.
#include<stdio.h>
#include<string.h>
int my_strcmp(char s1[], char s2[])
{ int i; i = strcmp(s1, s2); return i;} int main() { int flag; char s1[] = "hello world"; char s2[] = "hello abc"; flag = my_strcmp(s1, s2); if (flag == 0) { printf("%s等于%s\n", s1, s2); } elseif (flag > 0)
{ printf("%s大于%s\n", s1, s2); } else { printf("%s小于%s\n", s1, s2); } return 0; }