一、字元串的幾種定義方式及輸出
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;
}