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");
}
}
沒想到一個簡簡單單的符号引起了一系列的錯誤。
寫代碼一定要嚴謹呀!