1. 程式人生 > >C語言基礎知識筆記:day4字串與字元陣列

C語言基礎知識筆記:day4字串與字元陣列

注:本筆記為直接上傳,因各個markdown筆記語法的差異性,在顯示上略有區別。 如需原版請聯絡:[email protected]。(郵件主題為:學習筆記,正文需要的筆記名,可以直接複製該筆記的網址)。同時歡迎各位一起學習交流。

day4字串與字元陣列

  • 基礎知識的比較

    • ’\0’與ASCII中 space 的區別:

    ASCII中0~31為“非列印控制字元”,其中例如 0號對應的’\0‘ ,13號對應的回車鍵,將它們按字元的形式列印到螢幕上的時候均為“ ”,它和空格 “ ” 是有本質上的區別。空格對應的ASCII為32號,它屬於“列印字元”,只不過空格在螢幕上的表現形式也為 “ ” ,與無法列印的非列印控制字元顯示的效果一樣罷了。’\0‘僅僅作為一個字串結束標誌存在著,它的作用就是一個標誌!

1.字元陣列的定義

int main()
{
 //初始化的方法
   char array1[100] = {'a','b','c','d'};//法一
   char array2[100] = "abcd";  //法二
   char array3[] = "abcd";//陣列根據後面的元素個數自動分配空間


  printf("%s\n",array);  //輸出陣列值
  printf("%d\n",sizeof(array2));//得到的值為100
  printf("%d\n",sizeof(array3));//得到的值為5
   

  return 0}

2.1將一個字串裡面的元素進行排序 (使用sizeof函式,當且僅當定義陣列的大小正好包含完整元素的時候才可以)


#include<stdio.h>

int  main()

{

  int  i;

  int  j;

  char  array[5]  =  "acdb";

  for(i  =  0  ;i  <  (sizeof(array)-1)  ;  i++)

    {

      for(j  =  1;j  <  ((sizeof(array)-1)-i)  ;j++)

    {

  char  tmp;

  if(array[j-1]  >  array[j])

    {

    tmp  =  array[j];

    array[
j] = array[j-1]; array[j-1] = tmp; } } } printf("%s\n",array); return 0; }

2.2 法二:根據len的大小,這時候可以任意更改陣列大小

#include<stdio.h>

int  main()

{

  int  i;

  int  j;

  char  array[15]  =  "acdb";

  int  len  =  0;

  while(array[len++]);

  len  --;

  for(i  =  0  ;i  <  len;  i++)

  {

    for(j  =  1;j  <  (len-i)  ;j++)

    {

    char  tmp;

    if(array[j-1]  >  array[j])

    {

      tmp  =  array[j];

      array[j]  =  array[j-1];

      array[j-1]  =  tmp;

    }

  }

  }

  printf("(%s)\n",array);

  return  0;

}


2.3 sizeof和len的區別

根據以下的程式可以得到:sizeof得到的是陣列定義的長度,而len得到的是陣列中元素的個數(當是漢字的時候,就要取決於編碼來看)

#include<stdio.h>

int  main()

{

  char  s[10]  =  "1234";

  int  len;

  while(s[len++]);   //字串是以0結尾,即遇到0即視為結尾

  len  --;

  /*這裡的while語句等效為:

  *  while(str[i])
  *  {
  *  i++;
  *  }
  * i--;

  */

  printf("sizeof  =  %d\n",sizeof(s));

  printf("len  =  %d\n",len);

  return  0;

}

3.1 將字串進行逆置 1.直接進行逆置,即將後面的0也逆置到最前面(一般不會輸出結果因為後面很多0)

#include<stdio.h>

int  main()

{

  char  str[15]  =  "hello  world";

  int  min  =  0;

  int  max  =  14;

  while(min  <  max)

  {

  char  tmp;

  tmp  =  str[max];

  str[max]  =  str[min];

  str[min]  =  tmp;

  min++;

  max--;

  }

  printf("%s\n",str);

  return  0;

}

2.如果僅將“hello world”,這幾個字串進行倒置,就要先計算陣列長度;

#include<stdio.h>

int  main()

{

  char  str[15]  =  "hello  world";

  //求陣列的長度

  int len  =  0;

  while(str[len++]);
  len --;


  int  min  =  0;

  int  max  =  len-1;

  while(min  <  max)

  {

  char  tmp;

  tmp  =  str[max];

  str[max]  =  str[min];

  str[min]  =  tmp;

  min++;

  max--;

  }

  printf("%s\n",str);

return  0;

}

3.2如何將漢字進行倒置 在ASCII碼中1個位元組存放一個字元; 在GBK編碼中2個位元組存放一個漢字;倒置的時候需要兩個位元組共同互換位置,因此需要兩個中間變數 在UTF-8編碼中3個位元組存放一個漢字;

以下的示例是以GBK編碼為例;(Qt 中預設是UTF-8編碼)

(工具->選項 -> 文字編輯器 -> 行為 ->檔案編碼:將UTF-8的編碼更改為GBK編碼)

#include<stdio.h>

int  main()
{
  char  str[50]  =  "你好世界";

  int  len  =  0;
  while(str[len++]);
  len--;


  int  min  =  0;
  int  max  = len-1;
  while(min  <  max)
  {

  char  tmp;
  tmp  =  str[max  -1];
  str[max  -1]  =  str[min];
  str[min]  =  tmp;
  
  char  tmp1;
  tmp1  =  str[max];
  str[max]  =  str[min  +  1];
  str[min  +  1]  =  tmp1;
  min  +=  2;
  max  -=2;

  }
  printf("%s\n",str);
  return  0;

}

4.字串和字元陣列的差別

  • 定義及其使用上的區別
    • 字串:char *string = “andnf”;
    • 字元陣列:char a[100] = "andnf";或者char a[100] = {a,n,d,n,f}; 使用字串初始化字元陣列的時候沒要比逐個賦值多佔一個位元組,用於存放 \0 ,但是字元陣列的長度不會計算\0,而陣列佔有的位元組數會計算\0 ,
      • 輸入輸出:輸出的時候只要遇到‘\0’就會停止輸出;
      • 定義:定義字元陣列的時候,如果不賦值則必須規定陣列的大小;但是如果初始化了,就可以選擇規定大小或者不規定;如果不規定則系統會根據陣列的大小進行自動分配;
int main()
{
  char s[] = "abcd";
  char s1[] = {'a','b','c','d'};
  printf("%d\n",sizeof(s));
  printf("%d\n",sizeof(s1));
  return 0;
}

得到的結果分別是5和4.

字串在記憶體中是以0結尾;以下程式可以正常的輸出字串“abcd”,因為s[4]的值為0,所以這是一個字串;

#include<stdio.h>
int main()
{
  char s[5] = {0};
  s[0] = 'a';
  s[1] = 'b';
  s[2] = 'c';
  s[3] = 'd';
  printf("%s\n",s);
  return 0;
}

當將s[4]同樣賦值之後,在以%s輸出就是亂碼了,程式如下:

#include<stdio.h>
int main()
{
  char s[5] = {0};
  s[0] = 'a';
  s[1] = 'b';
  s[2] = 'c';
  s[3] = 'd';
  s[4] = 'e';
  printf("%s\n",s);
  return 0;
}

當一個數組之中既含有漢字又含有字母的時候

如果將一個字串當做char處理,那麼標準的ASACII字元一定是個整數,而漢字的第一個位元組一定是負數

字串的使用

1.去掉字串右邊的空格

#include<stdio.h>
int main()
{  
  char s[20] = "hello world   ";
  //首先獲取字串的長度
  int len = 0;
  while(s[len++]);
    len --;
    
  //因為是刪除字串右邊的空格,因此需要從最右邊進行遍歷;

  int i = 0;
  for(i = len - 1;i >= 0;i--)
    {
      if(s[i] != ' ')
       { 
         s[i + 1] = 0;
          break;
       }
    }
    printf("(%s)\n",s);
    return 0;

}

2.去掉字串左邊的空格

#include<stdio.h>

int  main()

{

  char  s[20]  =  "  hello  world";

  //首先獲取字串的長度

  int  len  =  0;

  while(s[len++]);

  len  --;  

  //因為是刪除字串右邊的空格,因此需要從最右邊進行遍歷;

  int  i  =  0;

  int  j  =  0;

  for(i  =  0;i  <=  len  -1;i++)

  {
    if(s[i]  !=  '  ')

    {
      for(j  =  0;  j  <  len  -1;j++)    //當是s[i]不等於空格的時候,將空格元素要替換掉

        {
        s[j]  =  s[i  +  j];
        }
        break;

    }

  }

  printf("(%s)\n",s);

  return  0;

}

法二:

#include<stdio.h>

int  main()

{

  char  s[20]  =  "  hello  world";

  //首先獲取字串的長度

  int  len  =  0;

  while(s[len++] ==' ');

  len  --; //得到了字串前面的空格數量 

   int i = len;
   while(s[i])
   {
     s[i-len] = s[i];
     i++;
   }
   s[i - len] = 0; 

  printf("(%s)\n",s);

  return  0;

}

3.字串到整數的變化

步驟:1.知道字串的長度 2.將每個字元讀取出來,轉化為整數後*10的長度-1次方; 3.將每個位計算和加起來

int main()
{
  char s[100] = "1234";
  int len = 0;
  while(s[len++]);
  len --;

  int value = 0;//存放變數,為將字串轉換為整數後的變數
  int i;
  int tmp = len;
  for (i = 0;i < len; i++) //遍歷字串
  {
    int base = 10; //求10的n次方
    if((tmp - i -1) == 0 )
    {
      base = 1;          //字串的最後一個時候乘1
    }
     else
     {
       int j;
       for(j = 1; j < (tmp -i -1);j++)
       {
         base *= 10;
       }
    
     }
      value += (base * (s[i] - '0'));  
  }
   printf("%d\n",value);
   return 0;
}



下面的程式有問題,輸出的值不對

#include<math.h>

#include<stdio.h>

int  main()

{

  char  s[10]  =  "1234";

  int  len  =  0;

  while(s[len++]);

  len  --;

  double  result  =  0;

  int  i;

  int  j;

  int  wei  =  0;

  for(i  =  0;i  <  len;  i++)

  {

  if(len  -  i  -1  ==  0)

  {

  wei  =  s[i];

  }

  else

  {

  for(j  =  0  ;j  <  len  -  1;j++)

  {

  double  x  =  10;

  double  y  =  len  -1  -j;

  result  +=  (s[j])*(pow(x,y));

  }

  }

  result  +=  wei;

  printf("%d\n",result);

  return  0;

}

}