首頁 > 軟體

C語言學習筆記之字串間的那些事

2022-04-17 22:00:03

字串表示方式

字串常數

用雙引號括起來的內容稱為字串常數,例如:"Hello, World!"為一個字串常數。雙引號中的字元和編譯器自動加入末尾的字元,都作為字串儲存在記憶體中。

字串常數屬於靜態儲存類別。當在函數中使用字串常數時,該字串只會被儲存一次,用雙引號括起來的內容被視為指向該字串儲存位置的指標,如以下例程所示:

/* strptr.c -- 把字串看做指標 */
#include <stdio.h>

int main(void) {

    printf("%s, %p, %cn", "Who", "you", *"are");

    return 0;
}

程式輸出結果如下:

Who, 0x400668, a

#strlen

strlen函數在使用前需要新增一個標頭檔案:#include<string.h>

函數宣告:size_tstrlen(const char *s);

函數功能:獲取字串的長度,不包括‘’。

返回值:返回字串中的字元個數(空格也算一個字元)

例:

#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指標指向的記憶體中,‘’也會拷貝過去。

函數返回值:目的記憶體的地址。

※※注意:在使用此函數時,必須保證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不拷貝‘’

                 2.如果n大於src指向的字串中的字元個數,則在dest後面填充n-strlen(src)個''

例:

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

#strcat和strncat

##strcat

函數宣告:char *strcat(char *dest,const char *src);

函數功能:strcat函數追加src字串到dest指向的字串的後面,追加的時候會追加''。

※※注意:保證dest指向的記憶體空間足夠大。

例:

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

 ##strncat

函數宣告:char *strncat(char *dest,const char *src,size_tn);

追加src指向的字串的前n個字元,到dest指向的字串的後面。

※※注意:如果n大於src的字元個數,則只將src字串追加到dest指向的字串的後面,追加的時候會追加''

例:

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

#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("%sn",a[i]);
	}
 } 

總結

到此這篇關於C語言學習筆記之字串間的那些事的文章就介紹到這了,更多相關C語言字串內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com