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;
}
}