2017-02-12 139 views
0

所以我宣佈了一個2d數組,並希望逐一顯示它的行。但是當我執行下面的代碼時,我看到矩陣中的所有行都從這個行開始我需要。打印一排2d字符數組(C++)

代碼:

#include<iostream.h> 
#include<conio.h> 
#include<stdio.h> 

char topics[3][10]={"Literature","Science---","Sports----"}; 

void main() 
{ 
    clrscr(); 
    cout<<topics[0][0]<<endl<<topics[1][0]<<endl<<topics[2][0]<<endl; 
    puts(topics[0]); 
    cout<<endl; 
    puts(topics[1]); 
    getch(); 
} 

輸出:

L  
S 
S 
LiteratureScience---Sports----   
Science---Sports---- 

我想我的程序做的是,看跌期權被執行時(0),只有 '文學' 應顯示當看跌期權( 1)執行時,只顯示「Science ---」。

我是初學者。請提出我應該做什麼改正。謝謝。 :)

+0

是turbo C++嗎? – Pbd

+0

@Pbd很可能,clrscr被使用 – minigeek

+0

10年前我在學校的第一個C++課程的記憶對我來說是稍縱即逝的。 :D – Pbd

回答

3

聲明:

char topics[3][10]={"Literature","Science---","Sports----"}; 

採取的是編譯器爲:

char topics[3][10]={"Literature\0","Science---\0","Sports----\0"}; 

這意味着,這些串的每一個由11個字符。

因此您需要將topics[3][10]更改爲topics[3][11]

+0

順便說一句,在最後一個字符串中有一個額外的'-',它由12個字符組成。 –

+0

「體育」是6個字符 - 他增加了四個連字符,結果以填充它到10沒有錯誤存在。 – Caleb

+0

@Caleb:Ooops ...沒錯,謝謝。順便說一句,你的編輯嘗試 - 作爲評論更好。 C和C++的答案略有不同(如果我沒有記錯的話,你的C適合C)。 –

1

問題是C中的字符串被\0終止。因此,您需要使用11字符來存儲長度爲10的字符串。如果您將陣列設置得太小(參見Why "initializer-string for array of chars is too long" compiles fine in C & not in C++?),則最後一個字符會被略過。因此,puts在字符串的末尾沒有找到\0,而是在數組包含零之後進入數組的末尾,因爲(幸運的是)該數組包含零。正如評論這可以使固定陣列尺寸正確

#include <stdio.h> 

char topics[3][11]={"Literature","Science---","Sports----"}; 

int main() 
{ 
    puts(topics[0]); 
    puts(topics[1]); 
} 

輸出是

Literature 
Science--- 

A C++編譯器不會接受你的程序:

3:59: error: initializer-string for array of chars is too long [-fpermissive] 
3:59: error: initializer-string for array of chars is too long [-fpermissive] 
3:59: error: initializer-string for array of chars is too long [-fpermissive] 

消失。

+0

我相信編譯器會爲每個字符串文字增加一個'\ 0',所以它不是'puts'找不到空字符。 –

+0

是的,你是對的。但是由於初始化器太長,這個尾部的'\ 0'實際上並不存儲。因此,下一個字符串立即啓動,而不用在中間加入'\ 0'來告訴'puts'字符串已經結束。 –

+0

好的,我傾向於猜測(儘管我不確定,因爲我手邊沒有任何可能的平臺),某些編譯器會給試圖用數量初始化顯式大小的數組時出現編譯錯誤大於這個尺寸的元素。 –

1

你不需要提及數組的尺寸顯式。編譯器完成這項工作。

const char *topics[] = {"Literature", "Science---", "Sports----"}; 

int main() { 
    puts(topics[0]); 
    puts(topics[1]); 
} 

注意,通過這種方式,這些字符串是只讀

+0

正確,儘管這會將該數組的性質從一個可修改的字符串數組更改爲一個不可修改的字符串數組。如果OP曾試圖改變任何這些字符串,那麼他/她將遇到另一個問題。 –

+0

@barakmanos是的,你是對的。使用我的代碼字符串是隻讀的。 –

+0

所以你可能想提到這是你答案的一部分(例如,「如果你不打算在你的程序執行過程中改變任何字符串,那麼你可以......」)。 –