字符串概念:
C語言中字符串就是用雙引號括起來的任意字符序列,在字符串中同時也可以包括轉義字符,它是以’\0’爲結尾的字符數組
如”helloworld”;
char *string = “helloworld”;
字符數組:
用來存放字符的數組,字符數組中每個元素存放一個字符,數組元素的類型爲char類型,初始化字符數組的時候最好以’\0’結尾,
‘\0’是結束符號
如:char string []= “helloworld”;
char array [] = {‘h’,’e’,’l’,’l’,’o’,’w’,’o’,’r’,’l’,’d’,’\0’};
char array [] = {“helloworld”};
注意:使用字符串初始化字符數組的時候,它比用字符逐個賦值要多佔用一個字節,用於存放’\0’,同時字符數組的長度不會去計算’\0’,但是數組佔有的字節數會將’\0’算上,是由系統自行來進行處理的
字符數組的輸入輸出:
注意:輸出的時候只要是遇到’\0’符號的時候,就會停止輸出
1. 通過循環來將字符數組逐個輸入輸出
2. 將整個字符串一次性進行輸出或輸入,C語言允許用數組名進行輸入一個字符數組,如:
char a[10];
scanf("%s",a);
char b [] = "girl";
printf("%s",b);
- 1
- 2
- 3
- 4
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char global_array[5];//全局變量會初始化
int main(int argc,char *argv[]){
char local_array[5];//局部變量是不會進行初始化的
char array1[] = {'h','e','l','l','o',' ','w','o','r','l','d','\0'};
char array2[] = "hello world";
char array3[] = {"hello world"};
char array4[5] = "helloworld";
char array5[20] = "helloworld";
//char array[6] = {'\0'};初始化類型
//char array6[10];
//memset(array6,0,sizeof(array6));//使用memset來對字符數組進行初始化
//字節的長度比字符串的長度要多1
printf("array1:%s sizeof array1:%d,strlen array1:%d\n",array1,sizeof(array1),strlen(array1));
printf("array2:%s sizeof array2:%d,strlen array2:%d\n",array2,sizeof(array2),strlen(array2));
printf("array3:%s sizeof array3:%d,strlen array3:%d\n",array3,sizeof(array3),strlen(array3));
printf("array4:%s sizeof array4:%d,strlen array4:%d\n",array4,sizeof(array4),strlen(array4));
printf("array5:%s sizeof array5:%d,strlen array5:%d\n",array5,sizeof(array5),strlen(array5));
char array6[10];
memset(array6,0,sizeof(array6));//使用memset來對字符數組進行初始化,也可以用來對內存進行初始化
printf("input a string:\n");//儘量不要數組越界,因爲在C 語言中,數組超出其操作內存的範圍,不會判錯,但是這種是及其不安全的,因爲操作的內存很
有可能是其他函數操作的內存
//scanf("%s",array6);使用scanf讀取內容,但是其是不會判斷字符串的長度的
//fgets可以從文件讀取,也可以從標準輸入進行讀取,使用stdin,使用fgets讀取字符串的時候,只能讀取字符(數組長度-1)個字符,解決了scanf的問題,同時
也解決了輸入空格的問題。
fgets(array6,sizeof(array6),stdin);
printf("%s\n",array6);
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
輸出結果爲:
array1:hello world sizeof array1:12,strlen array1:11
array2:hello world sizeof array2:12,strlen array2:11
array3:hello world sizeof array3:12,strlen array3:11
array4:hello sizeof array4:5,strlen array4:5
array5:helloworld sizeof array5:20,strlen array5:10
從上面的array4和array5我們可以看出,如果制定數組的長度,那麼此時我們輸出的字符串是按照數組的長度來進行輸出的
1:如果數組長度大於字符串的長度的時候 ,這個時候,輸出是完整的,數組長度爲定義的長度,字符串長度是數組中字符的長度
2:如果數組長度小於字符串長度的時候,輸出是不完整的 ,數組長度這個時候是定義的長度,處處的字符長度也爲定義的長度,字符串的長度同樣也是定義的長度
實戰注意:
儘量不要對字符數組長度進行定義,應該把這個長度交給系統來進行分配
一般情況下使用memset來對內存進行初始化
一般情況下我們使用fgets來進行字符數組的初始化,而不用scanf,因爲fgets很好的解決了輸入越界的問題以及數組的空格問題
下面這個案例就是通過字符數組來計算一句話中單詞的平均長度;
#include<stdio.h>
#include<string.h>
int main(void)
{
int letter = 0;
int word_count = 0;
int flag = 0;
char array[30] = {'\0'};
printf("Please input a sentence!\n");
fgets(array,sizeof(array),stdin);
int n = strlen(array);
int i = 0;
for(i = 0 ; i< n ; i++){
char ch = array[i];
if(ch == '\n')
break;
if(ch == ' '|| ch =='\t'){
flag = 0;
}else if(!flag && ch != ' ' && ch != '\t'){
word_count ++ ;
flag = 1;
}
if(ch != ' '&& ch!='\t'){
letter++;
}
}
printf("Average word length:%.1f\n",(float)letter/word_count);
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
代碼是可以直接進行run的,歡迎大家之處不足之處,在這裏就不進行運行了