1. 字符串输入与输出
1.1 字符串输出
1.1.1 puts()
用来向标准输出设备输出字符串并自动换行,把字符串输出到标准输出设备,将 ‘\0’ 转换为 ‘\n’
#include <stdio.h>
int puts(const char *s);
// 成功返回一个非负数,失败返回EOF,也就是-1
1.1.2 putchar()
将 c 对应的一个字符输出到标准输出设备中,可以是一个字符,也可以是 0 ~ 127 中的一个数字,会自动将其转换为对应的字符
#include <stdio.h>
int putchar(int c);
1.1.3 fputc()
输出一个指定的字符,但是可以指定输出文件
#include <stdio.h>
int fputc(int c, FILE *stream);
1.1.1 puts()
将指定的字符串输出到指定的文件中
#include <stdio.h>
int fputs(const char *s, FILE *stream);
1.2 字符串输入
1.2.1 gets()
从标准输入设备中获取字符串
#include <stdio.h>
char *gets(char *s);
// 成功返回指向s的指针,失败返回NULL
gets() 和 scanf() 对比:
- gets() 函数可以输入空格,以回车为分隔符。而 scanf() 的空格前后是两个字符串
- gets() 会将回车换行符从输入缓冲区中取出来,然后丢弃,所以不会有任何回车换行符。而对于 scanf() 再次读取,可以将换行符读取出来
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char s[100] = {0};
char s2[100] = {0};
char c;
scanf("%s", s);// 输入123回车
printf("s: %s\n", s);
scanf("%c", &c);
printf("c: %d\n", c);
gets(s2);
printf("s2: %s\n", s2);
exit(0);
}
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char s1[100] = {0};
char s2[100] = {0};
scanf("%s", s1);// 输入123 456
printf("s1: %s\n", s1);// 输出123
gets(s2);
printf("s2: %s\n", s2);// 输出 456
exit(0);
}
1.2.2 getchar()
读取一个无符号字符
#include <stdio.h>
int getchar();
从输入缓冲区中读取字符数据,但是只读取一个,包括空格、TAB、换行回车等
1.2.3 fgets()
#include <stdio.h>
char *fgets(char *s, int size, FILE *stream);
gets 只能从标准输入中获取数据,而 fgets 可以从文件中获取数据;gets 会将缓冲区中的换行符读取出来并丢弃,fgets 会将换行符读取出来但不丢弃,读取完之后会自动在末尾添加结束标志
1.2.4 fgetc()
#include <stdio.h>
int fgetc(FILE *stream);
以无符号 char 强制转换为 int 的形式返回读取的字符,但是可以从普通文件中获取
2. 字符串长度
#include <string.h>
size_t strlen(const char *s);
在计算字符串长度时,结束字符不会计算在内,但是在计算字符串大小的时候,结束字符 ‘\0’ 会计算在内
sizeof 和 strlen 的区别
- sizeof 是 C 语言内置的操作符关键字,而 strlen 是 C 语言的库函数
- sizeof 仅用于计算数据类型的大小或者变量的大小,而 strlen 只能以结尾为 ‘\0’ 的字符串作为参数
- 编译器在编译时就计算出了 sizeof 的结果,而 strlen 必须在运行时才能计算出
- sizeof 计算数据类型或变量会占用内存的大小,strlen 计算字符串的实际长度
3. 字符串拼接
3.1 strcat()
#include <string.h>
char *strcat(char *dest, const char *src);
// dest:目标字符串;src:源字符串;返回指向dest的指针
在调用函数时,必须保证 dest 有足够大的空间,否则会导致溢出错误。dest 结尾的 \0 会被覆盖,src 末尾的 \0 会保留
3.2 strncat()
该函数可以指定追加的长度
#include <string.h>
char *strncat(char *dest, const char *src, size_t n);
在追加后,即使没有到末尾,也会自动添加 \0
4. 字符串拷贝
4.1 strcpy()
#include <string.h>
char *strcpy(char *dest, const char *src);
拷贝函数会覆盖原有的内容,但是如果 dest 的字符个数大于 src 的话,多的内容会保留
4.2 strncpy()
#include <string.h>
char *strncpy(char *dest, const char *src, size_t n);
5. 内存填充
开辟一块指定大小的空间
5.1 memset()
#include <string.h>
void *memset(void *s, int c, size_t n);
将空间的前 n 个字符置为 c
5.2 bzero()
将一段内存空间全部置为 0
#include <string.h>
void bzero(void *s, size_t n);
6. 字符串比较
6.1 strcmp()
#include <string.h>
int strcmp(const char *s1, const char *s2);
// s1<s2 返回负数; s1>s2 返回整数; s1=s2 返回0
6.2 strncmp()
比较前 n 个字符
#include <string.h>
int strncmp(const char *s1, const char *s2, size_t n);
7. 字符串查找
7.1 strchr()
可以查找到给定字符串当中的某一个字符
#include <string.h>
char *strchr(const char *s, int c);
// 返回字符c在s中第一次出现的位置,如果没有找到就返回NULl
7.2 strrchr()
两者的不同是,该函数是从字符串的末尾开始查找,返回从前往后的最后一次出现的位置
#include <string.h>
char *strrchr(const char *s, int c);
7.3 strstr()
可以查找指定字符串在源字符串中第一次出现的位置
#include <string.h>
char *strstr(const char *haystack, const char *needle);
8. 字符串与数字互转
8.1 转为整形数据
8.1.1 atoi()、atol()、atoll()
这三个函数只能转换十进制表示的数字字符串。nptr 可以包含非数字字符,转换时跳过前面的空格字符,直到遇到数字字符或正负号才开始转换,而再遇到非数字或字符串结束时才结束转换
#include <stdlib.h>
int atoi(const char *nptr);
long atol(const char *nptr);
long long atoll(const char *nptr);
8.1.2 strtol()、strtoll()
这两个函数可以实现将多种不同进制数表示的字符串转换为整形数据
#include <stdlib.h>
long int strtol(const char *nptr, char **endptr, int base);
long long int strtoll(const char *nptr, char **endptr, int base);
// endptr:如果不为空,则这两个函数会将字符串中的第一个无效字符的地址存储在 *endptr中,如果根本没有数字,会将 nptr 的原始值存在当中,并返回0,也可以将其置为空,表示不接收相应信息。
// base:数字基数,必须介于2和36之间,包含2和36,或者特殊值0.这个参数决定了字符换转换为合法字符的取值范围,比如如果是36,那么可以转换为0~9,a~z,不区分大小写。为0的时候,如果字符串包含了一个 ’0x‘前缀,表示以16为基数,如果是 ’0‘ 前缀,表示以8为基数。当base为16的时候,字符串可以使用'0x'前缀
8.1.3 strtoul()、strtoull()
与上面两个函数基本一样,就是返回值不同
#include <stdlib.h>
unsigned long int strtoul(const char *nptr, char **endptr, int base);
unsigned long long int strtoull(const char *nptr, char **endptr, int base);
8.2 转为浮点型数据
#include <stdlib.h>
double atof(const char *nptr);
double strtod(const char *nptr, char **endptr);
float strtof(const char *nptr, char **endptr);
long double strtold(const char *nptr, char **endptr);
8.3 数字转字符串
建议使用前面介绍的格式化 IO 函数
9. 给应用程序传参
main 函数其实有三个参数
int main(int argc, char *argv[], char *envp[])
{}
/* argc:表示命令行参数个数
* argv:存放命令行参数的一个数组
* envp:环境变量,这里不做详细说明,通常可以省略不写
* /
比如实现一个程序,将源文件的内容追加到目标文件中,就可以在命令行这么写
./main desc.file src.file