目录
  • 字符串表示方式
  • #strlen
  • #strcpy和strncpy
    • ##strcpy
    • ##strcnpy
  • #strcat和strncat
    • ##strcat
    •  ##strncat
  • #strcmp和strncmp
    • ##strcmp
    • ##strncmp
  • #题目
    • 总结

      字符串表示方式

      字符串常量

      C语言学习笔记之字符串间的那些事

      用双引号括起来的内容称为字符串常量,例如:"Hello, World!"为一个字符串常量。双引号中的字符和编译器自动加入末尾的\0字符,都作为字符串存储在内存中。

      字符串常量属于静态存储类别。当在函数中使用字符串常量时,该字符串只会被存储一次,用双引号括起来的内容被视为指向该字符串存储位置的指针,如以下例程所示:

      /* strptr.c -- 把字符串看做指针 */
      #include <stdio.h>
      
      int main(void) {
      
          printf("%s, %p, %c\n", "Who", "you", *"are");
      
          return 0;
      }

      程序输出结果如下:

      Who, 0x400668, a

      #strlen

      strlen函数在使用前需要添加一个头文件:#include<string.h>

      函数声明:size_tstrlen(const char *s);

      函数功能:获取字符串的长度,不包括‘\0’。

      返回值:返回字符串中的字符个数(空格也算一个字符)

      例:

      #inclue<stdio.h>
      #include<string.h>
      int main()
      {
      	char str[]="hello world";
      	int len=strlen(str);
      	printf("%d",len);//len=11
      }

      #strcpy和strncpy

      ##strcpy

      函数声明:char *strcpy(char *dest,const char *src);

      函数说明:拷贝src指向的字符串到dest指针指向的内存中,‘\0’也会拷贝过去。

      函数返回值:目的内存的地址。

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

      例:

      #include<stdio.h>
      #include<string.h> 
      int main()
      {
      	char str[]="hello world";
      	char s[]="hello earth";
      	strcpy(str,s);
      	printf("%s",str);//打印结果是hello earth
      } 

      ##strcnpy

      函数声明:char *strncpy(char *dest,const char *src,size_tn);

      函数说明:将src指向的字符串前n个字节,拷贝到dest指向的内存中。

      返回值:目的内存的首地址。

      ※※注意:1.strncpy不拷贝‘\0’

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

      例:

      #include<stdio.h>
      #include<string.h> 
      int main()
      {
      	char str[]="hello world";
      	char s[]="hello earth";
      	strncpy(str,s,8);
      	printf("%s",str);
      } 

      C语言学习笔记之字符串间的那些事

      #strcat和strncat

      ##strcat

      函数声明:char *strcat(char *dest,const char *src);

      函数功能:strcat函数追加src字符串到dest指向的字符串的后面,追加的时候会追加'\0'。

      ※※注意:保证dest指向的内存空间足够大。

      例:

      #include<stdio.h>
      #include<string.h> 
      int main()
      {
      	char str[100]="hello world";
      	char s[]="hello";
      	strcat(str,s);
      	printf("%s",str);
      } 

      C语言学习笔记之字符串间的那些事

       ##strncat

      函数声明:char *strncat(char *dest,const char *src,size_tn);

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

      ※※注意:如果n大于src的字符个数,则只将src字符串追加到dest指向的字符串的后面,追加的时候会追加'\0'

      例:

      #include<stdio.h>
      #include<string.h> 
      int main()
      {
      	char str[100]="hello world";
      	char s[]="hello";
      	strncat(str,s,4);
      	printf("%s",str);
      } 

      C语言学习笔记之字符串间的那些事

      #strcmp和strncmp

      ##strcmp

      函数声明:int strcmp(const char *s1,const char *s2);

      函数说明:比较s1和s2指向的字符串的大小。

      比较的方法:逐个字符去比较ASCII码,一旦比较出大小则返回。

      返回值:

      如果s1指向的字符串大于s2指向的字符串,返回1

      如果s1指向的字符串小于s2指向的字符串,返回-1

      如果相等的话返回0

      例:

      #include<stdio.h>
      #include<string.h> 
      int main()
      {
      	char str1[]="hello world";
      	char str2[]="hello world";
      	int ret;
      	ret=strcmp(str1,str2);
      	printf("%d",ret);//ret==0
      } 

      ##strncmp

      函数声明:int strncmp(const char *s1,const char *s2,size_t n);

      函数说明:比较s1和s2指向的字符串中的前n个字符

      例:

      #include<stdio.h>
      #include<string.h> 
      int main()
      {
      	char s1[]="hello world";
      	char s2[]="hello earth";
      	int ret;
      	ret=strncmp(s1,s2,5);
      	if(ret>0)
      		printf("s1的前五个字符大于s2的前五个字符\n"); 
      	else if(ret<0)
      		printf("s1的前五个字符小于s2的前五个字符\n"); 
      	else
      		printf("s1的前五个字符等于s2的前五个字符\n"); 
      } 

      关于字符串的知识点我暂时梳理了这么多,还有许多未涉及到的地方,希望大家给予意见,接下来让我们做一道比较有意思的题目。

      #题目

      输入n行身份证号,按照年龄排序(从大到小)并输出。

      #include<stdio.h>
      #include<string.h>
       
      int main()
      {
      	char a[100][100],birth[100][100],s[100];
      	int n,i,j;scanf("%d",&n);
      	gets(s);
      	for(i=0;i<n;i++)
      	{
      		gets(a[i]);
      		strncpy(birth[i],a[i]+6,8);
      	}
      	for(i=0;i<n;i++)
      	{
      		for(j=i+1;j<n;j++)
      		{
      			if(strcmp(a[j],a[i])<0)
      			{
      				strcpy(s,a[j]);
      				strcpy(a[j],a[i]);
      				strcpy(a[i],s);
      			}
      		}
      	}
      	for(i=0;i<n;i++)
      	{
      		printf("%s\n",a[i]);
      	}
       } 

      总结

      声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。