看下去一定对你有帮助!有帮助就点个赞吧
字符串函数 指的是头文件 stdio.h
中的输入输出函数 和 头文件string.h
里定义的我们平时直接使用的函数。
一下是本节重点讲解的 10 个函数。对于生僻点的字符串函数我们以后再讲。
- putchar & getchar
- strlen & strnlen_s
- strcmp & strncmp
- strcpy & strncpy
- strcat & strncat
这些函数我们到处在用,可你有没有想过,究竟这些函数是怎么声明和定义的?他们远没有你想的那么简单。
以下被划掉的部分如果你理解,那是最好。不理解不可以不用纠结,慢慢来
(一)putchar & getchar
putchar
int putchar( int ch )
头文件:stdio.h
定义:写字符 ch 到 stdout 。在内部,字符于写入前被转换到 unsigned char 。
stdout:标准输出 我们后面会单独讲
意思就是:向标准输出写入一个字符
等价于 putc(ch, stdout) 。
参数:ch
要被写入的字符串
返回值:
成功时返回写入的字符。
失败时返回 EOF并设置 stdout 上的错误指示器
EOF(end of file)是一个宏,值为 -1
第一次看到这个函数的 返回类型 和 参数类型 我其实很懵:
嗯?
我输入的不是 char 类型的吗? 怎么参数类型是 int ?
我看到的不是 char 类型的 A
吗?怎么返回类型是 int?
其实,输出是什么不代表返回就是什么。scanf还返回整数呢,照样可以输出汉字。
下面的程序帮助大家理解:
int main(void) {
char ch = 'A';
int a = 0;
a = putchar(ch);
printf("\n%d", a);
return 0;
}
输出:
A
65
上面我说慢慢来的时候也许有同学不屑:“这还用慢慢来?早会了!”
那好吧,putchar
的上面的定义中说它等价于 putc
要不我们再来看看 putc 是怎么定义的?与 putc 类似的还有个 fputc
要想真正理解它们还得看看 ferror
,一个个来呗?
A watched pot never boils —— 心急吃不了热豆腐
getchar
int getchar(void)
头文件:stdio.h
定义:
从 stdin 读取下一个字符。
等价于 getc(stdin) 。
也就是 从标准输入读入一个字符
参数:无
返回值:
成功时为获得的字符
失败时为 EOF 。
getchar的返回值有什么用?
如何退出下面程序中的 while循环?
可以自己打出来先测试一下。
int main(void) {
int ch;
while ((ch = getchar()) != EOF) {
putchar(ch);
}
printf("EOF\n");
//退出循环的方式可能有两种:
//1.程序被关闭。EOF不会输出
//2.退出了循环,程序继续向下运行。EOF会被输出
return 0;
}
后面还会继续详细讲解 这部分知识。可以自行思考一下,也可以查阅资料看看。
我做了一个便于理解的图示,如果现在就想看,在公众号回复[0206]查看。
为了减少冗余,下面的程序我只写 main 函数部分,
但是在你写程序到时候你要记得引用头文件 string.h
(二)strlen & strnlen_s
帮你理解:
strlen: string lenth
strlen
size_t strlen( const char *str )
头文件:string.h
参数:str - 指向要检测的空终止字符串的指针
返回值: 空终止字节字符串 str 的长度。
定义:返回给定空终止字符串的长度,即首元素为 str 所指,且不包含首个空字符的字符数组中的字符数。
若 str 不是指向空终止字节字符串的指针则行为未定义。
什么是 空终止字节字符串?
空终止字节字符串( NTBS )是尾随零值字节(空终止字符)的非零字节序列。字节字符串中的每个字节都是一些字符集的编码。例如,字符数组 {’\x63’,’\x61’,’\x74’,’\0’} 是一个以 ASCII 编码表示字符串 “cat” 的 NTBS 。
strnlen_s
size_t strnlen_s( const char *str, size_t strsz )
头文件:string.h
参数:
str - 指向要检测的空终止字符串的指针
strsz - 要检测的最大字符数量
返回值:
成功时为空终止字节字符串 str 的长度,若 str 是空指针则为零,若找不到空字符则为 strsz 。
定义:
除了若 str 为空指针则返回零,而若在 str 的首 strsz 个字节找不到空字符则返回 strsz 。
若 str 指向缺少空字符的字符数组且该字符数组的大小 < strsz 则行为未定义;换言之, strsz 的错误值不会暴露行将来临的缓冲区溢出。
strlen 与 strnlen_s 的区别与用法
1.空指针
int main() {
char* str = NULL;
//str为空指针,行为未定义。程序会崩溃
printf("%d\n", strlen(str));
//str为空指针,返回 0
printf("%d\n", strnlen_s(str, 1));
return 0;
}
2.没有终止符的字符串数组当作函数参数
int main() {
char str[] = {
'H', 'E', 'L', 'L', 'O', };
printf("%d\n", strlen(str)