2014-09-08 2 views
3

를 사용하지 않고 문자에 대한 포인터의 배열을 선언 할 코드 ::내가 여기에 문자열

#include <iostream> 
using namespace std; 

const int MAX = 4; 

int main() 
{ 
    char key[20]; 
    char *names[MAX]; 

    for (int i=0; i<MAX; i++) 
    { 
    cout << " entr keys\n"; 
    cin >> key; 
    names[i]=key; 
    cout<< names[i]; 
    } 
    for(int i=0; i<MAX;i++) 
    { 
    cout << names[i]; 
    } 
    return 0; 
} 

입니다 I 두 번째 for 루프에 names[i]을 인쇄하면 반복적으로 입력 된 마지막 키가 계속 표시됩니다.

제발 : 나 어디서 잘못 될까요?

+3

'without using string' 여러분의 코드는 string을 사용해야하는 이유를 정확히 보여줍니다. 원시 배열의 작동 방식과 데이터를 복사하는 방법을 모를 것 같습니다. 힌트 :이'names [i] = key;'는'key'가 가리키는 것을 복사하지 않고 단순히'key' 포인터 자체를 복사합니다. – user657267

+1

'key'와 같은 4 개의 문자열을위한 충분한 공간이 필요합니다.'keys'를 가리키는 것이 아니라'names' 요소가 그것들을 가리 키도록해야합니다. 그리고 다른 문자열에 키를 복사하려면'strcpy()'또는'memmove()'를 사용해야합니다. 더 나은 것은''와'string'을 사용하면 나중에 걱정할 필요가 없습니다. –

답변

3

names[i]=key;을 실행할 때 실제로 key의 문자열 값을 names[i]으로 복사하지 마십시오.
name[i]은 키가있는 위치를 가리키고 있습니다 (name[i] & key 포인터이기 때문에).

그래서 모두 key 번을 여러 번 덮어 쓰고 names 포인터를 모두 가리키고 있습니다.

char* 대신 std::string으로 작업하거나 strcpy을 사용하여 이러한 문자열을 복사해야합니다. std::string으로 작업하는 것이 좋습니다. 당신이 key, 예를 들어,에

cout << " entr keys\n"; 
cin >> key; 

당신이 null로 끝나는 문자열을 삽입하고있는 라인을 실행

#include <iostream> 
#include <string> 
using namespace std; 

const int MAX = 4; 

int main() 
{ 
    string names[4]; 

    for (int i = 0; i < MAX; i++) 
    { 
    cout << "entr keys" << endl; 
    cin >> names[i]; 
    cout << names[i]; 
    } 
    for(int i=0; i<4;i++) 
    { 
    cout << names[i]; 
    } 
    return 0; 
} 
3

때마다이 같아야합니다 std::string 코드를 사용


"hello\0".

는 그 후 당신은 이름 포인터 배열의 셀에 key의 주소를 복사하여 저장 :

names[i]=key; // Now I point to 'key' 
cout<< names[i]; 

다음주기가 다시 시작됩니다. 어쨌든 두 번째부터는 문자열에 null로 끝나는 문자열을 삽입하여으로 바꿔 이전 내용을 덮어 씁니다. 당신이 "hi\0"를 입력했다면 두 번째 시간은 key 배열의 내용은
['h', 'i', '\0', 'l', 'l', 'o', '\0'] 

어쨌든 당신이 널 (NULL) 종료가 표시되는 다른 컨텐츠를 방지 할 수 있기 때문에 첫 번째 문자열을 인쇄 할거야 될 것입니다.

프로그램이 끝나면 동일한 키 배열에 4 개의 포인터가 있고 그 배열에는 이전 요소를 덮어 쓴 마지막 요소 만 포함됩니다.

const int MAX = 4; 

int main() 
{ 
    char key[4][20]; // <- Now this has two indices 
    char *names[4]; 

    for (int i = 0; i < MAX; i++) 
    { 
    cout << " entr keys\n"; 
    cin >> key[i]; 
    names[i]=key[i]; 
    cout<< names[i]; 
    } 
    for(int i=0; i<4;i++) 
    { 
    cout << names[i]; 
    } 
    return 0; 
} 

Live Example

1

수정 프로그램 : 당신은 할당해야

#include <iostream> 
using namespace std; 
#include <cstring> 

const int MAX = 4; 

int main() 
{ 
    char key[20]; 
    char *names[MAX]; 

    for (int i = 0; i < MAX; i++) 
    { 
    cout << " entr keys\n"; 
    cin >> key; 
    names[i] = new char[strlen(key) + 1];//names[i]=key; 
    strcpy(names[i], key); 
    cout<< names[i]; 
    } 
    for(int i=0; i<MAX;i++) 
    { 
    cout << names[i]; 
    } 
    for(int i=0; i<MAX;i++) 
    { 
    delete [] names[i]; 
    } 
    return 0; 
} 

(A string 배열을 사용하거나) 당신이 당신의 배열을 만들 bidimensional 일 수 있습니다 해결하기 위해

각 이름 [i]에 대한 공간과 작업이 완료되면 할당을 해제하고 하드 코드 된 4를 MAX