C語言中字符串和字符數組

字符串概念: 
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的,歡迎大家之處不足之處,在這裏就不進行運行了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章