2012-03-17 2 views
-1

Я хочу напечатать значение двухмерного массива по одному. Но мой код показывает один пункт много раз :(Пройдите через 2-мерный массив в C

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

void main() 
{ 
    char words[][5]={"Hiii","Hello"}; 
    int size; 
    char *cp,*p; 
    p=words; 
    clrscr(); 
    printf("%p ",p); 
    size=sizeof(words); 
    printf("Size %d\n",size); 
    for(cp=p;cp<(p+size);cp++) 
     printf("%s ",cp); 
    getch(); 
} 

Ожидаемые о/р
Hiii
Здравствуйте

Неожиданный о/р
Hiii
III
II
я

Hello
ELLO
LLO
ло
о

+0

Пожалуйста, добавьте «домашнее задание» тег, если это домашнее задание. Пока неясно, почему вы ожидаете «ожидаемого» выхода для данного кода. –

+0

@AlexeiLevenkov Это не ч/б, я застрял на этом уровне, но мне нужно показать что-то вроде «ожидаемого»! – Sourav

+0

@Sourav: опубликуйте компилируемый образец программы. Вывод, который вы опубликовали, даже не относится к программе. Где печатаются размеры массива? Вставить atleast complete o/p. –

ответ

2

Прежде всего, массив words выложен в памяти как

Hiii\0Hello 

Кроме того, поскольку cp является указателем на char, выражение cp++ приращения cp ровно на байтах. Это вы печатаете "Hiii", а затем "iii", затем "ii" и "i". Для правильности cp++ следует изменить на cp += 5.

И, наконец, массив имеет неправильный размер. Длина "Hiii" равна 5, а длина "Hello" равна 6, так как в конце каждой строки есть неявный нулевой ограничитель \0. Таким образом, words действительно должен быть объявлен как char words[][6]={"Hiii","Hello"};. Это также означает, что cp теперь должен увеличиваться на 6 каждый раз.

С поправками, сделанные, петля for становится

for(cp=p;cp<(p+size);cp+=6) 
    printf("%s ",cp); 

Чтобы сделать вашу жизнь проще, так как вы работаете с массивом, вы можете использовать индексы, а полагающаяся на арифметике с указателями:

int strCount = size/6; // since each element of words is 6 characters long 
for(int i = 0; i < strCount; i++) 
    printf("%s ", cp); 
+0

Спасибо, тонна, но есть ли способ найти «6» автоматически? – Sourav

+0

@Sourav: не с вашей текущей структурой кода. Вы можете объявить константу, например 'STRING_SIZE', которая имеет значение 6. Затем каждый' 6' может быть заменен на 'STRING_SIZE '. Это позволяет вам точно обновлять размер строки. –

+0

@KenWayneVanderLinde * слова массива выложены в памяти, например' Hiii \ 0Hello \ 0' *, это неправильно: в C он выложен как 'Hiii \ 0Hello' и в C++ это было бы неверно, так как в объявлении должно быть достаточно места для строки. – ouah

0

Вы используете ("% S", ср) - печатает нулем строка, начинающаяся форму cp, когда вы хотите напечатать персонажу cp очков.

+0

Okk, но% c не работает :(Но как получить желаемый результат? – Sourav

+0

Символ cp указывает на «* cp» –

0
char words[][5]={"Hiii", "Hello"}; 

Строковый литерал Hello длиной 6 символов (включая нулевой символ), но он инициализируется массив типа char[5] (запомнить words представляет собой массив 2 массива 5 из char).

Когда строковый литерал используется для инициализации массива фиксированного размера (здесь массив char[5]), для инициализации массива используется только количество элементов, которые вписываются в массив.

То есть, расположение память words является:

Hiii\0Hello 

завершающий нулевой символ "Hello" не копируется, так как он не вписывается в char[5] объекта.

(Обратите внимание, что это верно для C, в C++ было бы неверно инициализировать массив строковым литералом с большим количеством символов, что количество элементов в массиве).

В вашем случае, вы хотите, чтобы сделать некоторую комнату для прекращенного нулевого характера "Hello" и поэтому вы должны объявить words как:

char words[][6]={"Hiii", "Hello"}; 
      ^instead of 5 
Смежные вопросы