C语言要点总结——字符串处理函数

 

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语言要点总结——字符串处理函数

1.gets/puts

gets:从标准设备上获取一个字符串,这个字符串可以带空格,直到接收到换行字符“\n”或者字符串结束标志"\0"才停止,不安全,容易发生内存泄漏。

 char *gets(char *str)

参数

  • str -- 这是指向一个字符数组的指针,该数组存储了 C 字符串。

返回值

如果成功,该函数返回 str。如果发生错误或者到达文件末尾时还未读取任何字符,则返回 NULL。

 

puts:从标准设备上输出一个字符串,直到"\0"为止,字符串自带回车"\n"。输出到标准设备上时,会多一行回车。

 int puts(const char *str) 

参数

  • str -- 这是要被写入的 C 字符串。

返回值

如果成功,该函数返回一个非负值,如果发生错误则返回 EOF。

2.fgets/fputs (1的文件操作版本)

fgets:从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内

char *fgets(char *str, int n, FILE *stream)

参数

  • str -- 这是指向一个字符数组的指针,该数组存储了要读取的字符串。
  • n -- 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度。
  • stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流。

返回值

如果成功,该函数返回相同的 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) 

 

参数

  • str -- 这是一个数组,包含了要写入的以空字符终止的字符序列。
  • stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符串的流。

返回值

该函数返回一个非负值,如果发生错误则返回 EOF。

注意,字符串结束符"\0"不会被写入,不同于puts(),不会输出完字符串后,再输出一个换行符"\n"。

3.strlen(长度计算)

 strlen:计算字符串 str 的长度,直到"\0"结束,不包括结束字符。

 size_t strlen(const char *str) 

参数

  • str -- 要计算长度的字符串。

返回值

该函数返回字符串的长度。

纯手写版本strlen

while(arr[index] ! ='\0')
{
     index ++;
}

4.strcpy/strncpy(拷贝)

strcpy:把 src 所指向的字符串复制到 dest。需要注意的是如果目标数组 dest 不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况。不安全。会拷贝字符串结束符"\0"

char *strcpy(char *dest, const char *src)

参数

  • dest -- 指向用于存储复制内容的目标数组。
  • src -- 要复制的字符串。

返回值

该函数返回一个指向最终的目标字符串 dest 的指针。

#include <stdio.h>
#include <string.h>
 
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) 

参数

  • dest -- 指向用于存储复制内容的目标数组。
  • src -- 要复制的字符串。
  • n -- 要从源中复制的字符数。

返回值

该函数返回最终复制的字符串。

#include <stdio.h>
#include <string.h>

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

5.strcat/strncat(拼贴)

strcat:把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。结束符“\0”也会追加。

 char *strcat(char *dest, const char *src) 

参数

  • dest -- 指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串。
  • 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 -- 指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串,包括额外的空字符。
  • src -- 要追加的字符串。
  • n -- 要追加的最大字符数。

返回值

该函数返回一个指向最终的目标字符串 dest 的指针。

#include <stdio.h>
#include <string.h>

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|

6.strcmp/strncmp(比较)

strcmp:把 str1 所指向的字符串和 str2 所指向的字符串进行比较。

int strcmp(const char *str1, const char *str2) 

参数

  • str1 -- 要进行比较的第一个字符串。
  • str2 -- 要进行比较的第二个字符串。

返回值

该函数返回值如下:

  • 如果返回值 < 0,则表示 str1 小于 str2。
  • 如果返回值 > 0,则表示 str2 小于 str1。
  • 如果返回值 = 0,则表示 str1 等于 str2。
#include <stdio.h>
#include <string.h>
 
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) 

 

参数

  • str1 -- 要进行比较的第一个字符串。
  • str2 -- 要进行比较的第二个字符串。
  • n -- 要比较的最大字符数。

返回值

该函数返回值如下:

  • 如果返回值 < 0,则表示 str1 小于 str2。
  • 如果返回值 > 0,则表示 str2 小于 str1。
  • 如果返回值 = 0,则表示 str1 等于 str2。
#include <stdio.h>
#include <string.h>

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

7.printf/scanf

printf:发送格式化输出到标准输出 stdout,在输出字符串时,读取到字符串结束符"\0"时停止。

printf("<格式化字符串>", <参量表>);

规定符

  • %d 十进制有符号整数
  • %u 十进制无符号整数
  • %f 浮点数
  • %s 字符串
  • %c 单个字符
  • %p 指针的值
  • %e 指数形式的浮点数
  • %x, %X 无符号以十六进制表示的整数
  • %o 无符号以八进制表示的整数
  • %g 把输出的值按照 %e 或者 %f 类型中输出长度较小的方式输出
  • %p 输出地址符
  • %lu 32位无符号整数
  • %llu 64位无符号整数
#include <stdio.h>
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 -- 这是 C 字符串,包含了以下各项中的一个或多个:空格字符、非空格字符 和 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.12e4float *
%i读入十进制,八进制,十六进制整数 。int *
%o八进制整数。int *
%s字符串。这将读取连续字符,直到遇到一个空格字符(空格字符可以是空白、换行和制表符)。char *
%u无符号的十进制整数。unsigned int *
%x、%X十六进制整数。int *
%p读入一个指针 。 
%[]扫描字符集合 。 
%%读 % 符号。 
  • 附加参数 -- 根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。

返回值

如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。

eg:

#include<stdio.h>
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

 

8.strstr(查找字符串)

strstr:在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 '\0'

char *strstr(const char *haystack, const char *needle)

参数

  • haystack -- 要被检索的 C 字符串。
  • needle -- 在 haystack 字符串内要搜索的小字符串。

返回值

该函数返回在 haystack 中第一次出现 needle 字符串的位置,如果未找到则返回 null。

#include <stdio.h>
#include <string.h>


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

9.strchr(查找字符)

strchr:在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置

char *strchr(const char *str, int c)

参数

  • str -- 要被检索的 C 字符串。
  • c -- 在 str 中要搜索的字符。

返回值

该函数返回在字符串 str 中第一次出现字符 c 的位置,如果未找到该字符则返回 NULL。

#include <stdio.h>
#include <string.h>

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|

10.strtok(切割)

strtok:分解字符串 str 为一组字符串,delim 为分隔符。

char *strtok(char *str, const char *delim)

参数

  • str -- 要被分解成一组小字符串的字符串。
  • delim -- 包含分隔符的 C 字符串。

返回值

该函数返回被分解的第一个子字符串,如果没有可检索的字符串,则返回一个空指针。

#include <string.h>
#include <stdio.h>
 
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"

11.atoi(强制转换类型)

atoi():把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。如果输入混合形式的str,比如100saw100,只能读取到第一个100,到字符就会停止。会输出100,不会再多输出了。

 int atoi(const char *str) 

参数

  • str -- 要转换为整数的字符串。

返回值

该函数返回转换后的长整数,如果没有执行有效的转换,则返回零。

同理还有:

atof( ):把一个小数形式的字符串转化为一个浮点数

atol( ):将一个字符串转化为long类型

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值