C语言要点总结——字符串处理函数
目录
1.gets/puts
2.fgets/fputs (1的文件操作版本)
3.strlen(长度计算)
4.strcpy/strncpy(拷贝)
5.strcat/strncat(拼贴)
6.strcmp/strncmp(比较)
7.printf/scanf
8.strstr(查找字符串)
9.strchr(查找字符)
10.strtok(切割)
11.atoi(强制转换类型)
C语言要点总结——字符串处理函数
gets:从标准设备上获取一个字符串,这个字符串可以带空格,直到接收到换行字符“\n”或者字符串结束标志"\0"才停止,不安全,容易发生内存泄漏。
char *gets(char *str)
参数
返回值
如果成功,该函数返回 str。如果发生错误或者到达文件末尾时还未读取任何字符,则返回 NULL。
puts:从标准设备上输出一个字符串,直到"\0"为止,字符串自带回车"\n"。输出到标准设备上时,会多一行回车。
int puts(const char *str)
参数
返回值
如果成功,该函数返回一个非负值,如果发生错误则返回 EOF。
fgets:从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内
char *fgets(char *str, int n, FILE *stream)
参数
返回值
如果成功,该函数返回相同的 str 参数。如果到达文件末尾或者没有读取到任何字符,str 的内容保持不变,并返回一个空指针。
如果发生错误,返回一个空指针。
fgets()在读取一个用户通过键盘输入的字符串的时候,同时把用户输入的回车“\n”,也做为字符串的一部分。通过scanf和gets输入一个字符串的时候,不包括结尾的“\n”,但通过fgets结尾多了“\n”。fgets是安全的,不会出现缓冲区溢出的问题。
在str结尾处始终会加上“\0”。但是加不加"\n"就要看具体情况了。
如果n大于stream的大小,则会在结尾加上,\n \0,先加回车,再加结束符。
如果n小于stream的大小,则会自动加上"\0"。
fputs:把字符串写入到指定的流 stream 中,但不包括"\0"。
int fputs(const char *str, FILE *stream)
参数
返回值
该函数返回一个非负值,如果发生错误则返回 EOF。
注意,字符串结束符"\0"不会被写入,不同于puts(),不会输出完字符串后,再输出一个换行符"\n"。
strlen:计算字符串 str 的长度,直到"\0"结束,不包括结束字符。
size_t strlen(const char *str)
参数
返回值
该函数返回字符串的长度。
纯手写版本strlen
while(arr[index] ! ='\0')
{
index ++;
}
strcpy:把 src 所指向的字符串复制到 dest。需要注意的是如果目标数组 dest 不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况。不安全。会拷贝字符串结束符"\0"。
char *strcpy(char *dest, const char *src)
参数
返回值
该函数返回一个指向最终的目标字符串 dest 的指针。
#include
#include
int main ()
{
char str1[]="Sample string";
char str2[40];
char str3[40];
strcpy (str2,str1);
strcpy (str3,"copy successful");
printf ("str1: %s\nstr2: %s\nstr3: %s\n",str1,str2,str3);
return 0;
}
str1: Sample string
str2: Sample string
str3: copy successful
strncpy:把 src 所指向的字符串复制到 dest,最多复制 n 个字符。
当 src 的长度小于 n 时,dest 的剩余部分将用空字节填充,自然会包含"\0"。
当 src 的长度大于 n 时,不会包含字符串结束符"\0"。
char *strncpy(char *dest, const char *src, size_t n)
参数
返回值
该函数返回最终复制的字符串。
#include
#include
int main()
{
char src[40];
char dest[12];
memset(dest, '\0', sizeof(dest));
strcpy(src, "This is runoob.com");
strncpy(dest, src, 10);
printf("最终的目标字符串: %s\n", dest);
return(0);
}
最终的目标字符串: This is ru
strcat:把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。结束符“\0”也会追加。
char *strcat(char *dest, const char *src)
参数
返回值
该函数返回一个指向最终的目标字符串 dest 的指针。
#include < stdio.h >
#include < string.h >
int main ()
{
char src [ 50 ],dest [ 50 ] ;
strcpy (src , “ This is source ” );
strcpy (dest ,“ This is destination ” );
strcat (dest ,src );
printf (“ 最终的目标字符串:|%s | ” ,dest );
return (0 );
}
最终的目标字符串:| This is destinationThis This is source |
strncat:把 src 所指向的字符串追加到 dest 所指向的字符串的结尾,直到 n 字符长度为止。结束符“\0”也会追加。
char *strncat(char *dest, const char *src, size_t n)
参数
返回值
该函数返回一个指向最终的目标字符串 dest 的指针。
#include
#include
int main ()
{
char src[50], dest[50];
strcpy(src, "This is source");
strcpy(dest, "This is destination");
strncat(dest, src, 15);
printf("最终的目标字符串: |%s|", dest);
return(0);
}
最终的目标字符串: |This is destinationThis is source|
strcmp:把 str1 所指向的字符串和 str2 所指向的字符串进行比较。
int strcmp(const char *str1, const char *str2)
参数
返回值
该函数返回值如下:
#include
#include
int main ()
{
char str1[15];
char str2[15];
int ret;
strcpy(str1, "abcdef");
strcpy(str2, "ABCDEF");
ret = strcmp(str1, str2);
if(ret < 0)
{
printf("str1 小于 str2");
}
else if(ret > 0)
{
printf("str2 小于 str1");
}
else
{
printf("str1 等于 str2");
}
return(0);
}
str2 小于 str1
strncmp:把 str1 和 str2 进行比较,最多比较前 n 个字节。
int strncmp(const char *str1, const char *str2, size_t n)
参数
返回值
该函数返回值如下:
#include
#include
int main ()
{
char str1[15];
char str2[15];
int ret;
strcpy(str1, "abcdef");
strcpy(str2, "ABCDEF");
ret = strncmp(str1, str2, 4);
if(ret < 0)
{
printf("str1 小于 str2");
}
else if(ret > 0)
{
printf("str2 小于 str1");
}
else
{
printf("str1 等于 str2");
}
return(0);
}
str2 小于 str1
printf:发送格式化输出到标准输出 stdout,在输出字符串时,读取到字符串结束符"\0"时停止。
printf("<格式化字符串>", <参量表>);
#include
int main()
{
char ch = 'A';
char str[20] = "www.runoob.com";
float flt = 10.234;
int no = 150;
double dbl = 20.123456;
printf("字符为 %c \n", ch);
printf("字符串为 %s \n" , str);
printf("浮点数为 %f \n", flt);
printf("整数为 %d\n" , no);
printf("双精度值为 %lf \n", dbl);
printf("八进制值为 %o \n", no);
printf("十六进制值为 %x \n", no);
return 0;
}
字符为 A
字符串为 www.runoob.com
浮点数为 10.234000
整数为 150
双精度值为 20.123456
八进制值为 226
十六进制值为 96
scanf:从标准输入 stdin 读取格式化输入。遇到空白符(空格)停止。
scanf(const char *format, ...)
参数
format 说明符形式为:
[=%[*][width][modifiers]type=]
具体讲解如下:
参数 | 描述 |
---|---|
* | 这是一个可选的星号,表示数据是从流 stream 中读取的,但是可以被忽视,即它不存储在对应的参数中。 |
width | 这指定了在当前读取操作中读取的最大字符数。 |
modifiers | 为对应的附加参数所指向的数据指定一个不同于整型(针对 d、i 和 n)、无符号整型(针对 o、u 和 x)或浮点型(针对 e、f 和 g)的大小: h :短整型(针对 d、i 和 n),或无符号短整型(针对 o、u 和 x) l :长整型(针对 d、i 和 n),或无符号长整型(针对 o、u 和 x),或双精度型(针对 e、f 和 g) L :长双精度型(针对 e、f 和 g) |
type | 一个字符,指定了要被读取的数据类型以及数据读取方式。具体参见下一个表格。 |
scanf 类型说明符:
类型 | 合格的输入 | 参数的类型 |
---|---|---|
%a、%A | 读入一个浮点值(仅 C99 有效)。 | float * |
%c | 单个字符:读取下一个字符。如果指定了一个不为 1 的宽度 width,函数会读取 width 个字符,并通过参数传递,把它们存储在数组中连续位置。在末尾不会追加空字符。 | char * |
%d | 十进制整数:数字前面的 + 或 - 号是可选的。 | int * |
%e、%E、%f、%F、%g、%G | 浮点数:包含了一个小数点、一个可选的前置符号 + 或 -、一个可选的后置字符 e 或 E,以及一个十进制数字。两个有效的实例 -732.103 和 7.12e4 | float * |
%i | 读入十进制,八进制,十六进制整数 。 | int * |
%o | 八进制整数。 | int * |
%s | 字符串。这将读取连续字符,直到遇到一个空格字符(空格字符可以是空白、换行和制表符)。 | char * |
%u | 无符号的十进制整数。 | unsigned int * |
%x、%X | 十六进制整数。 | int * |
%p | 读入一个指针 。 | |
%[] | 扫描字符集合 。 | |
%% | 读 % 符号。 |
返回值
如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。
eg:
#include
int main(void)
{
int a,b,c;
printf("请输入三个数字:");
scanf("%d%d%d",&a,&b,&c);
printf("%d,%d,%d\n",a,b,c);
return 0;
}
请输入三个数字:1 2 3
1,2,3
char arr[100];
scanf("%[^\n]",arr);
可以读取空格,直到回车符停止读取。
scanf("%d %d %d",&a,&b,&c);
scanf("1%d2%d3%d",&a,&b,&c);分割输入内容,限定字符长度
printf("%d %d %d",a,b,c);
输入:122333
输出:1 22 333
scanf("%1s%2s",arr1,arr2);限定字符长度
printf("%s\n",arr1);
printf("%s",arr2);
输入:hello
输出:h
el
scanf("%*d%s",arr1);忽略整形
printf("%s\n",arr1);
输入:123hellow
输出:hellow
strstr:在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 '\0'。
char *strstr(const char *haystack, const char *needle)
参数
返回值
该函数返回在 haystack 中第一次出现 needle 字符串的位置,如果未找到则返回 null。
#include
#include
int main()
{
const char haystack[20] = "RUNOOB";
const char needle[10] = "NOOB";
char *ret;
ret = strstr(haystack, needle);
printf("子字符串是: %s\n", ret);
return(0);
}
让我们编译并运行上面的程序,这将产生以下结果
子字符串是: NOOB
strchr:在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置
char *strchr(const char *str, int c)
参数
返回值
该函数返回在字符串 str 中第一次出现字符 c 的位置,如果未找到该字符则返回 NULL。
#include
#include
int main ()
{
const char str[] = "http://www.runoob.com";
const char ch = '.';
char *ret;
ret = strchr(str, ch);
printf("|%c| 之后的字符串是 - |%s|\n", ch, ret);
return(0);
}
让我们编译并运行上面的程序,这将产生以下结果:
|.| 之后的字符串是 - |.runoob.com|
strtok:分解字符串 str 为一组字符串,delim 为分隔符。
char *strtok(char *str, const char *delim)
参数
返回值
该函数返回被分解的第一个子字符串,如果没有可检索的字符串,则返回一个空指针。
#include
#include
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
在第一次调用时:strtok()必须给予参数S字符串:
往后的调用则将参数S设置成NULL,每次调用成功则返回指向被分割出片段的指针。
注意:切割会破坏原始字符串,会将原始字符串中的分隔符部分,替换成字符串结束符"\0"。
atoi():把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。如果输入混合形式的str,比如100saw100,只能读取到第一个100,到字符就会停止。会输出100,不会再多输出了。
int atoi(const char *str)
参数
返回值
该函数返回转换后的长整数,如果没有执行有效的转换,则返回零。
同理还有:
atof( ):把一个小数形式的字符串转化为一个浮点数
atol( ):将一个字符串转化为long类型
#include
#include
#include
int main()
{
int val;
char str[20];
strcpy(str, "98993489");
val = atoi(str);
printf("字符串值 = %s, 整型值 = %d\n", str, val);
strcpy(str, "runoob.com");
val = atoi(str);
printf("字符串值 = %s, 整型值 = %d\n", str, val);
return(0);
}
让我们编译并运行上面的程序,这将产生以下结果:
字符串值 = 98993489, 整型值 = 98993489
字符串值 = runoob.com, 整型值 = 0