天天看點

C語言之字元串一、字元串的幾種定義方式及輸出二、字元串的存儲方式三、計算字元串中字元的個數(strlen)四、字元串幾種常用的API

一、字元串的幾種定義方式及輸出

1.第一種方式

#include<stdio.h>

int main()
{
	int i;
	char str[5] = {'a','b','c','d','e'};
	for(i=0;i<sizeof(str)/sizeof(str[0]);i++){
		printf("%c", str[i]);
	}
	
	return 0;
}
           

2.第二種方式

#include<stdio.h>

int main()
{
	int i;
	char str2[5] = "abcde";
	for(i=0;i<sizeof(str2)/sizeof(str2[0]);i++){
		printf("%c", str2[i]);
	}
	
	return 0;
}
           

3.第三種方式

#include<stdio.h>

int main()
{
	int i;
	char str3[] = "abcde";	//數組元素個數不寫,會根據真實大小預設配置設定 
	for(i=0;i<sizeof(str3)/sizeof(str3[0]);i++){
		printf("%c", str3[i]);
	}
	
	return 0;
}
           

4.第四種方式(推薦)

#include<stdio.h>

int main()
{
	//數組名就是位址(大多數情況下) 
	char *pstr = "hello world";
	printf("%s\n",pstr);	//字元串用格式占位符%s表示 

	return 0;
}
           

二、字元串的存儲方式

字元串在記憶體中,除了有效字元以外,還會自動在後面補一個‘\0’,作為字元串的結束标志

三、計算字元串中字元的個數(strlen)

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

int main()
{
	char str[] = "abcde";
		
	printf("str的真實字母個數為:%d",strlen(str));
		
	return 0;
}
           

注:計算字元串長度時,不能用sizeof來計算字元串中有效字元的個數,應該用strlen,strlen在計算字元串大小的時候,遇到’\0’後,就結束計數

四、字元串幾種常用的API

1.輸出字元串:puts()、printf()

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

int main()
{
	char *str = "abcde";
	
	puts(str);
	printf("%s",str);
		
	return 0;
}
           

2.擷取字元串:gets()、scanf()

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

int main()
{
	char str[128] = {'\0'};
	printf("請輸入字元串:\n");
	scanf("%s",pstr);
	gets(pstr);
	
		
	return 0;
}
           

注:避免書寫了野指針

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

int main()
{
	char *pstr;	//野指針,會造成非法記憶體通路,會出現段錯誤
	pstr = (char *)malloc(128);	//解決野指針的方法 
	printf("請輸入字元串:\n");
	//scanf("%s",pstr);
	gets(pstr);
	puts(pstr);
			
	return 0;
}
           

3.計算字元串長度:strlen()

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

int main()
{
	char str[] = "abcde";
		
	printf("str的真實字母個數為:%d",strlen(str));
		
	return 0;
}
           

4.字元串初始化;memset()

menset(初始化的對象,初始化成什麼,初始化多大的空間);

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

int main()
{
	char *pstr;	//野指針,會造成非法記憶體通路,會出現段錯誤
	pstr = (char *)malloc(128);	//申請了空間
	menset(pstr,'\0',128);	//初始化,把每一個元素都初始化為'\0' 
	
	printf("請輸入字元串:\n");
	//scanf("%s",pstr);
	gets(pstr);
	puts(pstr);
			
	return 0;
}
           

注:一旦用了malloc就要注注意記憶體洩漏的問題

5.字元串拷貝:strcpy()、strncpy()

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

int main()
{
	char *str1 = "abcde";
	char str2[128] = {'\0'};

	strcpy(str2,str1);	//将str1的内容完全拷貝到str2 
	printf("複制字元串完畢,%s\n",str2);
	
	memset(str2,'\0',sizeof(str2)/sizeof(str2[0]));//重置字元串
	strncpy(str2,str1,2);//選擇性拷貝
	printf("複制字元串的2個字元為,%s\n",str2); 
				
	return 0;
}
           

6.字元串拼接:strcat()

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

int main()
{
	char str1[128] = "abcde";
	char *str2 = "12345";
	
	strcat(str1,str2);
	puts(str1);
			
	return 0;
}
           

7.字元串比較:strcmp()

str1 > str2        輸出結果為:1 
str1 = str2        輸出結果為:0
str1 < str2        輸出結果為:-1 
           
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
	int ret1,ret2,ret3;
	char *str1 = "1234";
	char *str2 = "123";
		
	char *str3 = "123";
	char *str4 = "123";
		
	char *str5 = "123";
	char *str6 = "1234";
	
	ret1 = strcmp(str1,str2);
	ret2 = strcmp(str3,str4);
	ret3 = strcmp(str5,str6);
	
	printf("ret = %d\n",ret1);
	printf("ret = %d\n",ret2);
	printf("ret = %d\n",ret3);
			
	return 0;
		
}
           

8.查找子字元串:strchr()

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

int main()
{
	char *str = "12345";
	char c = '3';
	char *p = NULL;
	
	p = strchr(str,c);
	if(p == NULL){
		printf("沒有找到"); 
	}else{
		puts(p);
	}
	
	return 0;
		
}
           

注:找的是字元

9.查找子串:strstr()

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

int main()
{
	char *str = "12345";
	char *substr= "34";
	char *p = NULL;
	
	p = strstr(str,substr);
	
	if(p == NULL){
		printf("沒有找到"); 
	}else{
		printf("找到\n");
		puts(p);
	}
	
	return 0;
		
}
           

注;找的是字元串

10.轉為小寫:strlwr()

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

int main()
{
	char str[] = "HELLO WORLD";	//window下要定義成數組的形态
	puts(strlwr(str));

	return 0;
		
}
           

11.轉為大寫:strupr()

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

int main()
{
	char str[] = "hello world";	//window下要定義成數組的形态
	puts(strupr(str));

	return 0;
		
}
           

12.字元串分割:strtok()

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

int main()
{
	char *p;
	char str[] = "luo,xian,yi";
	p = strtok(str,",");
	printf("擷取到第1個串:p=%s\n",p);
	
	//擷取第2個串的方法很奇葩,跟第1次不一樣,目标字元串改成NULL
	p = strtok(NULL,","); 
	printf("擷取到第2個串:p=%s\n",p);
	
	//擷取第3個串的方法很奇葩,跟第2次一樣 
	p = strtok(NULL,","); 
	printf("擷取到第3個串:p=%s\n",p);
	

	return 0;
		
}
           

優化後的代碼:

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

int main()
{
	char *p;
	char str[] = "luo,xian,yi";
	p = strtok(str,",");
	int i = 2;
	
	if(p != NULL){
		printf("擷取到第1個串:p=%s\n",p);
	}
	while(1){
		p = strtok(NULL,",");
		if(p != NULL){
			printf("擷取到第%d個串:p=%s\n",i,p);
		}else{
			printf("沒有子串了\n",p);
			break;
		}
		i++;		
	}
	
	return 0;
		
}
           

繼續閱讀