2012-10-20 2 views
1

문자열을 2 차원 배열로 변환하는 방법을 아는 사람이 있습니까? 이것은 내 시도 :문자열을 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]; 
    } 
    } 

그러나 숫자가 올바르게 인쇄되지 않습니다. 나는 모든 것을 w로 인쇄하기를 원하지만 단순히 횡설수설 한 것을 인쇄합니다. 나는 또한 내가 문자열을하면 (81) 그때 나는 많은 오류를 보았다. 누구든지 나를 도울 수 있을까? 감사.

+0

은 무엇 출력을 생성 않고 당신이 어떤 결과를 기대합니까? 제발 좀 더 구체적으로 말하십시오. – Lion

+0

글자 w에서 2 차원 문자 배열로 모든 것을 출력 할 것으로 예상했다. 이걸 좀 도와 주실 래요? 감사. – 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

와우 덕분에 2 차원 문자 배열이 괜찮습니다. 난 그때 1 질문을 - 출력하려고하면 2 차원 배열의 첫 번째 문자가 삭제됩니다. 왜 이걸 수정했는지 아시겠습니까? 도와 주셔서 감사합니다! – user1567909

+0

흠, 확실하지 않습니다. 그것은 이상한 문제입니다. 당신이 할 때 :'cout << w << endl;은 거기에있는 모든 문자입니까? –

+0

흥미롭게도 충분히 흥미로운 점은 인쇄물을 인쇄 할 때 .. – user1567909

0

당신은 당신이 아주 잘하려는 당신이하지 않은 것을 설명하지 않은 발생하는 문제에 대해 설명 했으므로 다음은 추측을 기반으로합니다.

빠른 갈색 여우가 게으른 개를 뛰어 넘었다 :

은 그래서 당신이 할하려는 것은 같은 문자열을입니다 보인다.

과 같은 2 차원 배열에 그것을 넣어 : 코드 문제

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 

한 것은 당신이 sw에서 값을 복사 할 인덱스 p 내에서 실제로 있는지 확인하지 않는다는 것입니다 경계. 당신은 while(p != w.size())라고 말하는 줄에서 이것을 처리하려고 시도한 것 같습니다. 그러나 바깥 쪽 루프는 p이 범위를 넘어서서 증가하지 않도록 보호하고 내부 루프에서 사용됩니다. 대신에 p++; if (p==w.size()) break;과 같은 것을 넣어야합니다. 내부 루프의 가장 큰 부분은 p입니다. 또는 더 나은 아직 배열을 통해 대신 문자열을 반복해야합니다. 다음 의사 코드와 같은 뭔가 루프

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

는 또한, 여기 디버깅하고 같이 잘 배열을 시각화하는 몇 가지 코드의 .:의 전체 while(p){for(k){for(j){}}} 세트를 대체 할 것이다. 당신은 변경하지 않고이 프로그램을 실행하면

#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 .  
관련 문제