字符串及字符串函数的使用--C语言

一、字符串的输入与输出

char word[8];

scanf("%s",word);
print("%s\n",word);

                        scanf读入一个连续的单词(到空格、回车或tab为止)

解析:如上程序1、输入少于8个连续字母,打印也是这少于8个连续字母

          如上程序2、输入hello word这10个字母,打印的是hello这五5个字母,读到空格就结束

          如上程序3、输入超过8个字母,并且连续的,即输入helloword,打印出错,因为word[8]只有7个位置可读入.第八个位置是\0.

二、字符串数组

2.1  char **a; 是什么

a是一个指针,指向另一个指针,那个指针指向一个字符(串)

2.2  char  a[][5];   第二个格子(列),必须有准确的数字

 字符数组的引用  (注意事项)

用字符串方式赋值比用字符逐个赋值要多占1个字节,用于存放字符串结束标志‘\0’;

2.3、数组的长度

一.计算一维数组长度对于  array[B] 形式的数组,可以通过计算 sizeof 获取数组长度,举个例子:

int len = sizeof(array)/sizeof(array[0]);


2.4.计算二维数组长度
对于 type array[A][B] 形式的二维数组,可以通过计算 sizeof 获取行列数

sizeof(array[0][0])   是一个元素(格子)占用的空间;
sizeof(array[0])       为一行元素(一行格子)占用的空间;
sizeof(array)          为整个数组占用的空间;


1).二维数组行数


二维数组行数 = sizeof(array)/sizeof(array[0]);


2).二维数组列数


二维数组列数 = sizeof(array[0])/sizeof(array[0][0]);

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

int main()
{
	int i;
	int h;
	char word[][6]={"hello",
	                "word",
			        "huai"};
 
    h= sizeof(word)/sizeof(word[0]);  //求数组的行数

   for(i=0;i<h;i++)
 {
	printf(" %s\n",word[i]);

  }	
	
	return 0;
	}

输出结果

 hello
 word
 huai

三、strlen 和 sizeof区别

1)strlen函数获取字符串的长度,但不包括\0.

2)sizeof函数是获取空间的大小

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

int main()
{


   char data[10]="hello";

   printf("strlen=%d\n",strlen(data));

   printf("sizeof=%d\n",sizeof(data));

   char *a="hello";  //此串内容,包括了\0,即有6个字节
 
   printf("strlen=%d\n",strlen(a));
   
 
 return 0;
 
   
  }

 运行结果

strlen=5
sizeof=10

strlen=5

 四、字符串拷贝函数

4.1、函数的定义:

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

函数功能:

                 就是把src指向的字符串拷贝到dest指向的内存,并且也拷贝‘\0’

函数返回值:

             dest 的内存的地址。

注意:

          在使用此函数的时候,必须保证dest指向的内存空间足够大,否则会出现内存污染

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

int main()
{


   char A[15]="hello word";
   char B[8] ="WWO";

   strcpy(A,B);
    
   printf("A=%s\n",A);
  for(int i=0; i<11;i++)
  {
    printf("A[%d] = %c \n",i,A[i]);
    }


  
 return 0;
 
   
  }

运行结果

A=WWO
A[0] = W 
A[1] = W 
A[2] = O 
A[3] =  
A[4] = o 
A[5] =   
A[6] = w 
A[7] = o 
A[8] = r 
A[9] = d 
A[10] =  

 由上述代码可知,把B拷贝到A,输出A的结果是B,即WWO内容,但是,把A遍历之后发现,里面还是有原来没被覆盖的字符。为什么输出结果会这样??这是不管是printf 还是sacnf 只要遇到空格、换行符就打印结束。

4.2、函数的定义

                     char  *strncpy(char * dest ,const  char *src, size_t n);

函数功能

             将src指向的字符串前n个字节,拷贝到dest指向的内存中

函数返回值

             dest 的内存的首地址。

    注意:1)strncpy不拷贝'\0'

               2)如果n大于src 指向的字符串中的字符个数则在dest后面填充n -  strlen(src)个‘\0’。

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

int main()
{


   char A[11]="hello word";
   char B[8] ="WWO";

   strncpy(A,B,strlen(B));
    
   printf("A=%s\n",A);
  for(int i=0; i<11;i++)
  {
    printf("A[%d] = %c \n",i,A[i]);
    }
  
 return 0;
  
  }

 运行结果

A=WWOlo word
A[0] = W 
A[1] = W 
A[2] = O 
A[3] = l 
A[4] = o 
A[5] =   
A[6] = w 
A[7] = o 
A[8] = r 
A[9] = d 
A[10] =  

 五、字符串追加函数

5.1、函数定义

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

功能:

strcat 函数追加 src 字符串到 dest 指向的字符串的后面,追加的时候会追加‘\o’

注意:

                      保证 dest 指向的内存空间足够大

   

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

int main()
{


   char A[15]="hello word";
   char B[8] ="aab";
  //从A的\0的位置开始追加字符,并且也把B的\0加进去了
   strcat(A,B);
    
   printf("A=%s\n",A);

 return 0;
  
  }

运行结果

 A=hello wordaab

 5.2、函数定义

                      char * strncat  (char *dest ,const char *src,size_t n);

功能:

           追加src 指向的字符串的前n个字符,到dest 指向的字符串的后面。

注意:

如果n大于 src 的字符个数,则只将src字符串追加到dest 指向的字符串的后面追加的时候追加‘\0’.

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

int main()
{


   char A[15]="hello word";
   char B[8] ="aabhhj";
  //从A的\0的位置开始追加字符,并且也把B的\0加进去了
   strncat(A,B,3);
    
   printf("A=%s\n",A);

 return 0;
  
  }

运行结果

 A=hello wordaab

六、字符串比较函数

6.1   函数定义

                   int strcmp(const  char  *s1  ,const char *s2);

函数功能:

                 比较s1 和  s2 指向字符串的大小,

                  比较方法:逐个字符去比较ascII码,一旦比较大小返回。

 返回值:

         如果s1指向的字符串大于 s2 指向的字符串    返回>0

         如果s1指向的字符串小于 s2 指向的字符串    返回<0 

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

int main()
{
   int ret1;
   int ret2;
   int ret3;
   char s1[]="hello";
   char s2[]="hella"; 
   char s3[]="hell"; 
   ret1 = strcmp(s1,s2);   
   ret2 = strcmp(s3,s2);
   ret3 = strcmp(s3,s3);
	printf("ret1=%d\n",ret1);  
	printf("s1跟s2比较,返回一个正数,即s1比s2大,且大了这个数\n");
	
    printf("ret3=%d\n",ret3);
	printf("s3跟s3比较,返回一个0,即   s3=s3\n");
	
	printf("ret2=%d\n",ret2);
	printf("s3跟s2比较,返回一个负数,即s1比s2小,且小了这个数的绝对值\n");
   return 0;
}

运行结果

 ret1=14
s1跟s2比较,返回一个正数,即s1比s2大,且大了这个数
ret3=0
s3跟s3比较,返回一个0,即   s3=s3
ret2=-97
s3跟s2比较,返回一个负数,即s1比s2小,且小了这个数的绝对值

6.2    函数定义

             int strncmp(const  char  *s1  ,const char *s2,size_t  n);

函数功能:

            比较s1  和  s2指向的字符串中的前n个字符

 七、字符串查找函数

7.1   函数定义

                   char *strchr(const char *s,int c);

函数功能:首次匹配

            在字符指针s指向的字符串中,找第一次出现的ASCII为 c 的字符

注意:

           是首次匹配,如果s指向的字符串中有多个ASCII为c的字符,则找的是第一个字符

返回值:

           找到了返回找到的字符地址 

            找不到返回NULL

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

int main()
{


   char s[]="hel6l0 worl6d";
  
   char *ret = strchr( s ,'6');
	
	if(ret==NULL)
	{
	 printf("no find \n");;
	 }
	 else 
	 { 
       printf("找到了,在数组的第%d位置 \n",ret-s);
	 }
 return 0;
  
  }

运行结果

找到了,在数组第3位置  

7.1、函数定义

                     char *strrchr(const char *s,int c);

函数的功能:末次匹配

                 在s指向的字符串中,找最后一次出现的ASCII为 c 的字符

返回值:

           找到了返回找到的字符地址

            找不到返回NULL

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

int main()
{


   char s[]="hel6l0 worl6d";
  
   char *ret = strrchr( s ,'6');
	
	if(ret==NULL)
	{
	 printf("no find \n");;
	 }
	 else 
	 { 
       printf("找到了,在数组第%d位置 \n",ret-s);
	 }
 return 0;
  
  }

运行结果

 找到了,在数组第11位置 

八、字符串匹配函数

 8.1、函数定义

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

函数功能:首次匹配

               在haystack 指向的字符串中查找 needle指向的字符串,也是首次匹配

返回值:

             找到了返回找到的字符地址

             没找到返回NULL

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

int main()
{


   char s[]="1234:4567:666:789:7777";
  
   char *ret = strstr( s ,"666");   //找的是,第一个\0之前的字符串,即  666
	
	if(ret==NULL)
	{
	 printf("no find \n");;
	 }
	 else 
	 { 
       printf("找到了,在数组第%d位置 \n",ret-s);
	 }
 return 0;
  
  }

运行结果

 找到了,在数组第10位置 

 九、字符串转换数值

函数定义:


                          int atio(const char *nptr);      (字符串都是数字才行) 

函数功能

              将nptr指向的数字型字符串转换成整数,

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

int main()
{


     char s[]="7856";
	 char s1[]="3.155456";
  
     int ret1 = atoi( s );            //atoi转int 型
	 double ret2 = atof( s1 );       //atof转double型

	 printf("ret1 = %d\n ",ret1);
     printf("ret2 = %lf\n ",ret2);


 return 0;
  
  }

运行结果

 ret1 = 7856
 ret2 = 3.155456

 十、字符串切割函数

函数定义:

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

 函数的功能

        字符串切割,按照delim 指向的字符串中的字符,切割str 指向的字符串。其实就是在str指向的字符串中发现了 delim 指向字符串中的字符,就将其变成‘\0’。调用一次 strtok 只切割一次,切割一次之后,再去切割的时候strtok 的第一参数传NULL,意思就是接着上次切割的位置继续切。

注意:

       如果str 字符串中出现了连续的几个delim中的字符,则只将第一个字符变成‘\0’.

 返回值:

         返回切割下来的字符串的首地址,如果都切割完毕,则返回NULL

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

int main()
{


   char s[]="1234:4567:666:789:7777";
    
   char *ret = strtok(s,":");
   printf("ret= %s\n",ret); 
 
   printf("接着切割,第一个参数填null\n");
	
  while((ret=strtok(NULL,":")))
  {
    printf("ret= %s\n",ret); 
  
  } 	
 return 0;
  
  }

运行结果

ret= 1234
接着切割,第一个参数填null
ret= 4567
ret= 666
ret= 789
ret= 7777

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值