常用函数
conio.h
注意:这个头文件是 Windows 特有的
getch()
int getch(void)
无回显无缓冲区输入单个字符。输入一个字符后会立即读取,不用按下回车键。
(回显:用户输入的字符直接显示在屏幕上。无回显:输入后不会显示用户输入的字符,就好像根本没有输入一样。)
回显在大部分情况下是有必要的,它能够与用户及时交互,让用户清楚地看到自己输入的内容。但在某些特殊情况下,我们却不希望有回显,例如输入密码,有回显是非常危险的,容易被偷窥。
getche()
-
int getche(void)
回显【echo】回显无缓冲输入单个字符。输入一个字符后会立即读取,不用按下回车键。
stdio.h
puts()
-
int puts(char *str)
只显示字符串,并自动在显示的字符串末尾加上换行符。该函数在遇到空字符(\0)时结束输出。
gets()
-
char *gets(char *str)
将读取的字符串填充至str中,遇到换行符时结束;
特殊情况:如只输入一个换行符,gets()也不会将换行符填入str中(若本身str未初始化,那么经过该操作后,str仍然处于未初始化状态)
缺点:
gets()
函数不进行边界检查(在某些编译器可能会发出警告),如果输入的字符串过长,即多余的字符超出了指定的目标空间,这些字符有可能会擦写掉程序中的其他数据,过去,有的人利用该特性插入一些破坏系统安全的代码,因此在C99标准中建议不要使用(保留gets()是为了保证现有使用gets()的程序还能正常运行),然而在C11标准中,直接剔除了gets()函数。
fgets()
-
char *fgets(char *str, int count, FILE *stream)
有指定范围的读取字符串到str中,且允许指定读取的来源, 遇换行符结束(换行符也能被读取并存储)
- 第二个参数指明读入字符的最大数量,如果该参数为n,则读入n-1个字符(剩余字符留在输入流中),或者读到第一个换行符为止。
- 第三个参数指明要读取的文件,如果是读取从键盘输入的,则以
stdin
作为参数
与gets()不同点,fgets()不会丢弃换行符,会把他存储在字符串中(空间足够时);
fputs()
int fputs(const char *str, FILE *stream)
只显示字符串,末尾不加换行符;第二个参数为输出文件,如果要显示在计算机屏幕上,应该使用
stdout
为参数。fputs函数是puts针对文件定制的版本。
gets_s()
-
char *gets_s(char *str, size_t n)
gets_s()和fgets()的区别:
(1)gets_s()只从标准输入中读取数据,所以不需要第3个参数;
(2)如果gets_s()读到换行符,会丢弃它而不是存储它;这里和gets()函数几乎一样,完全可以用gets_s()替换gets()。
(3)如果gets_s()读到最大字符数都没有读到换行符或文件结尾,会执行以下几步。首先把目标函数数组中的首字符设置为空字符,读取并丢弃随后的输入直至读到换行符或文件结尾,然后返回空指针。接着,调用依赖实现的“处理函数”(或你选择的其他函数),可能会中止或退出程序。
使用gets()函数不安全,它会擦除现有数据,存在安全隐患。gets_s()函数很安全,但是,如果并不希望程序终止或退出,就要知道如何编写特殊的“处理函数”。所以当输入与预期不符时,gets_s()完全没有fgets()函数灵活、方便。鉴于此,fgets()通常是处理类似情况的最佳选择。
s_gets()
-
该函数是用户定义的函数,在stdio.h中并不存在,在这里出现只是为了解决以下问题
读取整行输入并用空字符替代换行符,或者读取一部分输入,丢弃其余部分。
char *s_gets(char *st, int n) { char *ret_val, *find; ret_val = fgets(st, n, stdin); if(ret_val) { find=strchr(st,'\n'); //查找换行符 if(find) //存在换行符 *find='\0'; else //若没有换行符,这说明未读取完全部字符串 while(getchar()!= '\n') continue; } return ret_val; }
getchar()
int getchar(void)
从
stdin
中读取一个字符,包括不可见字符。
putchar()
-
int putchar(int ch)
将参数输出到stdout中去,包括不可见字符。
返回值:成功时返回写入的字符。
sprintf()
-
int sprintf(char *buffer, const char *format, ...)
该函数与printf类似,但是它是吧数据写入字符串,而不是打印在显示器上,并且和fprintf也不同,fprintf是写入文件指针所指向的文件中,而该函数是写入一个char类型的目标字符串中。
- 第一个参数是char类型目标数组
- 第二、三个参数和printf的参数相同,只不过输出位置不同。
stdlib.h
atoi()
int atoi(const char *str)
转译
str
所指的字节字符串中的整数值。舍弃任何空白符,直至找到首个非空白符,然后接收尽可能多的字符以组成合法的整数表示,并转换之为整数值。合法的整数值含下列部分:
- 正(可选)或负号
- 数位
int atoi( const char *str ); //ascii to int long atol( const char *str ); //ascii to long long long atoll( const char *str ); //ascii to long long
输入示例:
123 -> 123 //正常输入 +123 -> 123 -123 -> -123 123sa456 -> 123 //只接收第一段非空数字字符 sa456 -> 0 //首个非空字符非数字字符 adfb -> 0
free()
void free(void *ptr)
释放ptr指向的空间。
malloc()
-
void malloc(size_t size)
分配size个字节的未初始化内存块,分配成功返回数组的地址,分配失败返回NULL。
注意:分配空间后的返回值一定要进行强制类型转换,例如
char *name = (char *)malloc(sizeof(char) * 5);
分配五个char类型的空间
string.h
memset()
-
void *memset(void *str, int v, size_t n)
把v的值转换为unsigned char后拷贝至str指向的前n个字节中。
注意事项:memset(nums, 1, sizeof(nums)),之后nums中的答案不是1,要注意memset是以字节填充数组,因此答案不是1
memset(nums, 0, sizeof(nums))或者memset(nums,-1,sizeof(nums)),答案是0或-1,在32位int中,-1是以1111111····1111(补码)来表示的,因此填充后答案还是-1
memcpy()
void *memcpy(void *str, const void *data, size_t n);
把大小为n的data指向的空间拷贝到str中去。
strlen()
-
size_t strlen(const char *str)
返回str字符串的字符数。(不包括空字符
'\0'
)该函数的实现方法是计算从
str
地址开始到\0
这段空间中字符的个数,因此当字符数组不含空字符时,返回值可能不准确。
strcat()
-
char *strcat(char *restrict str1, const char *restrict str2)
进行字符串的拼接,在str1的基础上追加str2,返回的是str1的首地址。
具体实现:将第二个字符串连接到第一个字符串中第一个\0出现的位置。不检查第一个数组的大小是否可以容纳第二个字符串。如果第一个数组的已分配的内存不够容纳第二个字符串,则多出来的字符将会溢出到相邻的内存单元。
strncat()
-
char *strncat(char *restrict str1, const char *restrict str2, size_t count)
在strcat()的基础基础上增加了字符拼接数量上的限制。即最多只可在str1上追加count个字符。
详细说明:count是str1中第一个’\0’到最后一个’\0′(不包括最后一个’\0′)的可使用位置个数。strncat()的结束条件为:追加的个数达到限制个数count或str2到达空字符位置(如果未满足限制条件,str2中的空字符也会拼接到str1中去),函数操作结束。
值得注意的是:如果将str2拼接到str1中去,str1仍有剩余空间,那么str2只是覆盖str1中第一个\0到str2长度的空间,不影响其他位置的数据,例如
str1[10] = "abcd"; str1[1] = '\0'; str2[2] = "0"; strncat(str1, str2, 5);
执行后str1中数据为:str1 = {'a', 'b','\0','d'}
strcmp()
-
int strcmp(const char *str1, const char *str2)
比较【compare】strcmp()的参数只能是字符串。该函数比较两个字符串是否相等。相等时返回0,不相等时:依次进行比较,直到达到第一个不同的字符时,若str1的ASCII码大于str2的ASCII码时返回正值,反之返回负值。
注意:strcmp函数只会比较字符数组中第一个空字符之前的部分。即strcmp比较的是字符串而不是整个字符数组。两个字符串不相等时,返回的非零值不一定是字符串str1和字符串str2的第一个不同的字符的ASCII码的差值。
strncmp()
-
int strncmp(const char *str1, const char *str2, size_t count)
strcmp()
函数比较字符串中的字符时,直到发现不同的字符为止,这一过程可能持续到字符串的末尾。而strncmp()
函数进行了改进,可以比较到字符不同的地方,也可以只比较到第三个参数限定的字符数。在满足第三个参数限定的范围时,strncmp可以一直进行比较,直到到达第一个不同的字符位置,并按照strcmp的规则返回值。若strncmp的返回值为0,则说明两个字符串前count个字符相同。
strcpy()
-
char *strcpy(char *restrict str1, const char *restrict str2)
将字符串str2拷贝到字符串str1中,其中str1称为目标字符串,str2称为源字符串。缺点在于该函数不判断目标数组能否容纳原字符串。同时该函数也会拷贝str2所有内容,包括空字符。
注意:该函数有两个特别的属性
- 返回值类型为
char *
,该函数返回的是目标数组str1地址。 - 第一个参数不必指向数组的开始位置,可以是str1 + x;(x为任意不大于
strlen(str1)
的正整数)
举例:
char *orig = "beast"; char copy[40] = "Be the best that you can be."; char *ps; puts(orig); puts(copy); ps = strcpy(copy + 7, orig); puts(orig); puts(copy);
输出:
beast Be the best that you can be. beast Be the beast
- 返回值类型为
strncpy()
char *strncpy(char *restrict str1, const char *restrict str2, size_t count)
该函数在strcpy函数的基础上增加了第三个参数,第三个参数指明可拷贝的最大字符数。
注意:当
strlen(str2) > strlen(str1)
时,count应该设置为strlen(str1) - 1
,并同时将str1最后一个位置设置为空字符。这样做确保了函数执行操作后,str1仍然是一个字符串。
strchr()
-
char *strchr(const char *s, char ch)
如果s字符串包含ch字符,该函数返回指向s字符串首次出现ch字符的指针(末尾的空字符也是字符串的一部分,所以在查找范围内),如果在字符串s中未找到ch字符,该函数返回空指针。
strrchr()
-
char *strrchr(const char *s, char ch)
该函数返回s字符串中c字符最后一次出现的位置(末尾的空字符也是字符串的一部分,所以在查找范围内)。如果未找到ch字符,这返回空指针。
strstr()
-
char *strstr(const char *str1, const char *str2)
返回一个指针,指向str1中首次出现str2子串序列的起始指针,如果未找到,则返回NULL。