2012-10-20 53 views
1

我想知道有谁知道如何将字符串转换为2d数组?这是我的尝试:将字符串转换为char 2d数组

string w; 
char s[9][9]; 
int p=0; 
getline(cin, w); 
while(p != w.size()) 
{ 
    for (int k = 0; k < 9; k++) 
    { 
    for(int j = 0; j < 9; j++) 
    { 
     s[k][j] = w[p]; 
     p++; 
    } 
    } 
} 
    cout << "nums are: " << endl; 
    for(int k = 0; k < 9; k++) 
    { 
    for(int j = 0; j <9; j++) 
    { 
     cout << s[k][j]; 
    } 
    } 

但是数字不能正确打印。我想要s [k] [j]打印出w中的所有内容,但它只是打印出乱码。我也注意到如果我做字符串[81],那么我会遇到一大堆错误。任何人都可以帮我吗?谢谢。

+0

它会产生什么输出和你所期望的输出?请更具体地说。 – Lion

+0

嗯,我希望它输出从字符串w到2-D字符数组s的所有东西。你能帮我解决这个问题吗?谢谢。 – user1567909

+0

确保您的字符串'w'获得成功读取且包含足够的元素(至少81)。在输出中,可能需要在打印9个字符后插入换行符。 ...并回答你上次评论的问题:是的,我们可以做你的功课,但这不会帮助你。 –

回答

1

试试这个:

const int NUM_ROWS = 9; 
const int NUM_COLS = 9; 

string w; 
char s[NUM_ROWS][NUM_COLS]; 

getline(cin, w); 

if (w.size() != (NUM_ROWS * NUM_COLS)) 
{ 
    cerr << "Error! Size is " << w.size() << " rather than " << (NUM_ROWS * NUM_COLS) << endl; 
    exit(1); 
} 

for (int count = 0; count < w.size(); count++) 
{ 
    if (!isdigit(w[count]) && w[count] != '.') 
    { 
     cerr << "The character at " << count << " is not a number!" << endl; 
    } 
} 

for (int row = 0; row < NUM_ROWS; row++) 
{ 
    for(int col = 0; col < NUM_COLS; col++) 
    { 
     s[row][col] = w[col + (row * NUM_COLS)]; 
    } 
} 

cout << "Nums are: " << endl; 

for(int row = 0; row < NUM_ROWS; row++) 
{ 
    for(int col = 0; col < NUM_COLS; col++) 
    { 
     cout << s[row][col] << " "; 
    } 

    cout << endl; 
} 

基于我们的聊天,你可能会想这样的:

const int NUM_ROWS = 9; 
const int NUM_COLS = 9; 

string w; 
char s[NUM_ROWS][NUM_COLS]; 

while (!cin.eof()) 
{ 
    bool bad_input = false; 

    getline(cin, w); 

    if (w.size() != (NUM_ROWS * NUM_COLS)) 
    { 
     cerr << "Error! Size is " << w.size() << " rather than " << (NUM_ROWS * NUM_COLS) << endl; 
     continue; 
    } 

    for (int count = 0; count < w.size(); count++) 
    { 
     if (!isdigit(w[count]) && w[count] != '.') 
     { 
      cerr << "The character at " << count << " is not a number!" << endl; 
      bad_input = true; 
      break; 
     } 
    } 

    if (bad_input) 
     continue; 

    for (int row = 0; row < NUM_ROWS; row++) 
    { 
     for(int col = 0; col < NUM_COLS; col++) 
     { 
      s[row][col] = w[col + (row * NUM_COLS)]; 
     } 
    } 

    cout << "Nums are: " << endl; 

    for(int row = 0; row < NUM_ROWS; row++) 
    { 
     for(int col = 0; col < NUM_COLS; col++) 
     { 
      cout << s[row][col] << " "; 
     } 

     cout << endl; 
    } 
} 
+0

哇谢谢,不只是一个2d字符数组是好的。我只有1个问题 - 当我尝试输出它时,2d数组中的第一个字符被删除。你可能知道为什么/解决这个问题?谢谢您的帮助! – user1567909

+0

嗯,我不确定。这是一个奇怪的问题。当你这样做时:'cout << w << endl;'是那里的所有角色? –

+0

嗯,有趣的是,当我回合时,有注意打印出来,.. – user1567909

0

您还没有描述你想要什么做的非常好,你有没有描述了你遇到的问题,所以以下是基于猜测。

所以看起来你正在试图做的是采取类似的字符串:

敏捷的棕色狐狸跳过了懒惰的狗。

并将它放入一个二维数组,如:

0 1 2 3 4 5 6 7 8 
0 T h e q u i c k 
1 b r o w n f o 
2 x j u m p e d 
3 o v e r t h e 
4 l a z y d o g s 
5 . x x x x x x x x 
6 x x x x x x x x x 
7 x x x x x x x x x 
8 x x x x x x x x x 

有一件事你的代码错误是,当你从w的值复制到s你不确保指数p实际上是内边界。你好像试图用while(p != w.size())这个词来解决这个问题;但是这是一个外部循环,不会保护p不会增加超出范围并在内部循环中使用。相反,你必须在p++; if (p==w.size()) break;之内放置最内层的循环,你可以增加p。或者更好的是,你应该遍历字符串而不是数组。像下面的伪代码的东西会取代你的整个while(p){for(k){for(j){}}}一套循环。:

for(size_t i=0; i<w.size(); ++i) { 
    int k = compute target row from i 
    int j = compute target column from i 
    s[k][j] = w[i] 
} 

而且,这里的一些代码,以更好地可视化阵列为你调试。

#include <iostream> 

int main() { 
    char s[9][9] = {"The","quick","brown","fox","jumped","over","the","lazy","dogs."}; 

    // your code to get input and copy it into the array goes here 
    // 
    // for(size_t i=0; i<w.size(); ++i) { 
    //  int k = compute target row from i 
    //  int j = compute target column from i 
    //  s[k][j] = w[i] 
    // } 

    std::cout << " 0 1 2 3 4 5 6 7 8\n"; 
    for (int i=0; i<9; ++i) { 
     std::cout << i; 
     for (int j=0; j<9; ++j) 
      std::cout << ' ' << s[i][j]; 
     std::cout << '\n'; 
    } 
} 

如果你不进行任何更改运行该程序的输出应该是这样的:

0 1 2 3 4 5 6 7 8 
0 T h e  
1 q u i c k  
2 b r o w n  
3 f o x  
4 j u m p e d 
5 o v e r  
6 t h e  
7 l a z y  
8 d o g s .  
相关问题