天天看點

c語言字元串未初始化,C語言字元串初始化錯誤

C語言字元串初始化錯誤

在寫指針數組題目時,遇到數字轉換問題。

問題如下:

将大于0小于1000的阿拉伯數字轉換為羅馬數字。

表示個位數:I,II,III,IV,V,VI,VII,VIII,IX

表示十位數:X,XX,XXX,XL,L,LX,LXX,LXXX,XC

表示百位數:C,CC,CCC,CD,D,DC,DCC,DCCC,CM

我選擇了查表法。

第一次(錯誤的)代碼如下:

#include

int main()

{

char* a[][10] = { "","I","II","III","IV","V","VI","VII","VIII","IX"//應有逗号

"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC",

"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM" };//将羅馬數字儲存在字元串數組裡。

int n, t;

while (scanf("%d", &n) > 0) {

for (int i = 0, j = 1000; i < 3; ++i, j /= 10) {

t = (n % j) / (j / 10);//t為(j-1)所在數位的數值

printf("%s", a[2 - i][t]);

}

printf("\n");

}

}

編譯器可以正常運作但一直在警告。

[Warning] deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]

//警告:不推薦從字元串常量轉換為’char '[-Wwrite-strings]

為什麼呢?

經過查閱資料,我了解到原來char *背後的含義是:給我個字元串,我要修改它。

而理論上,我們傳給函數的字面常量是沒法被修改的。

是以說,比較合理的辦法是把參數類型修改為const char *。

這個類型說背後的含義是:給我個字元串,我隻要讀取它。

第二次(錯誤的)代碼如下:

#include

int main()

{

const char* a[][10] = { "","I","II","III","IV","V","VI","VII","VIII","IX"//應有逗号

"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC",

"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM" };//将羅馬數字儲存在字元串數組裡。

int n, t;

while (scanf("%d", &n) > 0) {

for (int i = 0, j = 1000; i < 3; ++i, j /= 10) {

t = (n % j) / (j / 10);

printf("%s", a[2 - i][t]);

}

printf("\n");

}

}

經過測試得到以下資料

1

CXI

9

CXIX

10

CXX

11

CXXI

99

CIX

100

CCX

150

CCLX

999

(null)IX

一開始看到這串資料,我整個人都炸了。

經過多次推理,我堅信我解題的邏輯并沒有問題

但我锲而不舍地測試以及學長的幫助下後,代碼終于崎岖且正确了。

第三次(正确的)代碼如下:

int main()

{

const char* a[][10] = { "","I","II","III","IV","V","VI","VII","VIII","IX"//應有逗号

"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC",

"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM" };//将羅馬數字儲存在字元串數組裡。

int n, t;

while (scanf("%d", &n) > 0) {

if (n < 10)

printf("%s", a[0][n]);

else {

for (int i = 0, j = 1000; i < 3; ++i, j /= 10) {

t = (n % j) / (j / 10);

if (i == 2)

printf("%s", a[2 - i][t]);

else if(t>=1)

printf("%s", a[2 - i][t - 1]);

}

}

printf("\n");

}

}

經過測試代碼正确,這說明字元數組存儲""是無效的。

但我一直在想,它為什麼會是無效的?

看了很多資料,我一直都沒有找到答案。

剛剛在優化代碼的時候無意中發現了字元串數組a[0][10]"IX"後沒有逗号。

第四次(正确的)代碼如下:

#include

int main()

{

const char* a[][10] = { "","I","II","III","IV","V","VI","VII","VIII","IX",

"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC",

"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM" };//将羅馬數字儲存在字元串數組裡。

int n, t;

while (scanf("%d", &n) > 0) {

for (int i = 0, j = 1000; i < 3; ++i, j /= 10) {

t = (n % j) / (j / 10);

printf("%s", a[2 - i][t]);//t為(j-1)所在數位的數值

}

printf("\n");

}

}

沒想到一個簡簡單單的符号引起了一系列的錯誤。

寫代碼一定要嚴謹呀!