2010-11-30 2 views
1

Можно создать дубликат:
nul terminating a int arrayC - различие между 0 и 0 в целочисленном массиве

Я пытаюсь напечатать все элементы в массиве:

int numbers[100] = {10, 9, 0, 3, 4}; 
printArray(numbers); 

используя данную функцию:

void printArray(int array[]) { 
    int i=0; 
    while(array[i]!='\0') { 
     printf("%d ", array[i]); 
     i++; 
    } 
    printf("\n"); 
} 

проблема заключается в том, что, конечно, C не различает только один нулевой элемент в массиве и конец массива, после которого все 0 (также обозначается \ 0).

Я знаю, что нет никакой разницы грамматически между 0 и \ 0, так что я искал способ или взломать для достижения этого:

10 9 0 3 4 

вместо этого

10 9 

Массив также может выглядеть так: {0, 0, 0, 0}, поэтому, конечно, выход еще должен быть 0 0 0 0.

Любые идеи?

+0

спасибо, что я увидел его и проголосовал за закрытие, я немного взломал его. – Gal 2010-11-30 21:53:49

+0

В общем случае используйте `` \ 0`` в контексте символа, чтобы ссылаться на нуль и использовать `0` в целочисленном контексте. Компилятор обрабатывает почти то же самое, но имеет разные значения для программиста, читающего ваш код. Просмотр кода, который сравнивает `int i` с` `\ 0'`, вызывает в моей памяти предупреждения. Как и присваивание `* str = 0` вместо` * str = '\ 0``. – tomlogic 2010-11-30 23:15:34

ответ

9

Не завершайте массив со значением, которое также может быть в массиве.

Вы должны найти UNIQUE терминатор.

Поскольку вы не указали никаких отрицательных чисел в массиве, я рекомендую оканчивающийся -1:

int numbers[100] = {10, 9, 0, 3, 4, -1}; 

Если это не сработает, считает: INT_MAX или INT_MIN.

В крайнем случае, код последовательность значений, которые не должны быть в вашем массиве, такие как: -1, -2, -3, который указывает на завершение.

Нет ничего особенного в том, что касается 0 или \0. Завершите работу независимо от того, что работает для вашего дела.


Если ваш массив действительно может содержать все значения в любом порядке, то терминатор не представляется возможным, и вы будете иметь отслеживать длину массива.

Из вашего примера, это будет выглядеть так:

int numbers[100] = {10, 9, 0, 3, 4}; 
int Count = 5; 
int i; 

for(i=0; i<Count; ++i) 
{ 
    // do something with numbers[i] 
} 
0

Для массива, объявленного

int numbers[100] = {10, 9, 0, 3, 4}; 

нет абсолютно никакого способа отличить явную 0 в инициализаторе из неявных нулей, используемых для инициализируйте хвостовую часть массива. Это те же самые нули. Итак, то, что вы хотите сделать, не может быть сделано буквально.

Единственный способ сделать это - выбрать значение int как зарезервированное выделенное значение терминатора и всегда добавлять его в конце массива явно. То есть если вы выбираете -42 как значение терминатора, вы должны были бы объявить его как

int numbers[100] = {10, 9, 0, 3, 4, -42}; 

и перебирать до первого -42 в циклах.

0

Типичные способы реализации этого являются:

  • определяют значение дозорный (которые другие предложили)
  • определения структуры с междунар (фактическое значение) и логическое значение (с указанием, если это дозорный) и сделать массив из тех, вместо
  • передать длину массива с массивом
  • определяют структуру, которая содержит в себе как массив и длину и передать, что вместо

Обратите внимание, что первый и второй элементы почти идентичны.

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