2016-01-25 2 views
0

Выполняя некоторый код, у меня нет ожидаемых результатов из-за самоизменения значений массива внутри и снаружи цикла. Почему это происходит?Почему элементы массива имеют разные значения внутри и снаружи цикла?

char* arr[2]; 
int i=0; 
char inp[20]; 
while(i<2) 
    { 
    cin>>inp; 
    arr[i]=inp; 
    cout<<arr[i]<<endl; 
    i++; 
    } 
cout<<arr[0]<<endl; 
cout<<arr[1]<<endl; 

Для ввода:

aaa 
bbb 

Выход есть:

aaa 
bbb 
bbb 
bbb 
+0

Вы уверены в своем выходе? Ideone производит другое, согласующееся с уже предоставленными ответами: http://ideone.com/y2YQjX – Anedar

+0

@iharob Массивы - особенно инкапсулированные 'std :: array' - очень эффективны во многих случаях. Разумеется, для таких динамических массивов, как это, кажется, «вектор» лучше, но на общем уровне, как вы его сформулировали, я не согласен ни с одной из рекомендаций, которые вы делаете. –

+0

@ M.M Благодарим вас за разъяснение, я удалю комментарий. –

ответ

3

Следующая строка не делать то, что вы думаете:

arr[i]=inp; 

Здесь вы присваивая arr[i] указатель на inp, не копируя буфер inp ut в arr[i]. Во время той же итерации (т. Е. На первом cout << arr[i]) все в порядке. Как только вы перезапишете содержимое inp, изменения отразятся во всех ячейках arr, которые вы присвоили этому же указателю. Фактически, в конце цикла все ячейки arr указывают на inp, что означает, что вы всегда увидите последнее значение, извлеченное из cin.

В качестве решения, сделать arr массив из "строк" и скопировать буфер ввода с помощью strncpy:

char arr[2][20]; 
int i=0; 
char inp[20]; 
while(i<2) 
    { 
    cin>>inp; 
    strncpy(arr[i], inp, 20); 
    cout<<arr[i]<<endl; 
    i++; 
    } 
cout<<arr[0]<<endl; 
cout<<arr[1]<<endl; 

Или использовать C++ std::string, если это возможно.

+0

По-прежнему любопытно, почему две последние строки: 'aaa', а не' bbb 'как ожидалось. Наверное, плохой манипулятор от ОП. – mikedu95

+1

@ mikedu95 Мое лучшее предположение заключается в том, что OP ошибся при написании вывода вручную вместо копирования и вставки его из выхода программы. В любом случае проблема здесь довольно ясна :) –

+0

Yess ... Это была ошибка ... Я был просто смущен, почему я все время получал bbb ... Thanx @StefanoSanfilippo – Himanshu

Смежные вопросы