2016-11-13 3 views
2

Мне нужно инициализировать массив символов до 0. Я сделал это, какПечать значения элемента с инициализацией 0-типа ничего не печатает, почему?

char array[256] = {0}; 

Я хотел проверить, если он работал, поэтому я попытался тестирования

#include <stdio.h> 

int main() 
{ 
    char s[256] = {0}; 
    printf("%c\n", s[10]); 
    return 0; 
} 

После того как я скомпилировать и запустить его, вывод командной строки ничего не показывает.

Что мне не хватает? Возможно, я неправильно инициализировал массив?

+6

Что вы ожидаете от печати? –

+0

Он печатает буквальный ноль, и поэтому 'printf' считает, что это сделано, потому что это отмечает конец строки. – usr2564301

+0

мой плохой, ошибаюсь :) @SouravGhosh –

ответ

9

TL; DR -%c - символ представления. Используйте %d, чтобы увидеть десятичное значение 0.

Связанные с C11, глава §7.21.6.1, (курсив мой )

c                 Если ни один модификатор l длина не присутствует, то int аргумент преобразуется в a unsigned char, и полученный символ записывается.

FYI, см. Список значений printable.

При этом для размещенной среды int main() должен быть int main(void), по крайней мере, соответствовать стандарту.

+1

Спасибо. Действительно, нужно было перейти от '% c' к'% d' –

5

Вы печати s[10] в качестве символа (%c), и числовое значение s[10] является 0, который представляет символ \0, что означает конец строки, и не имеет текстовое представление. По этой причине вы ничего не видите.

Если вы хотите, чтобы увидеть числовое значение вместо значения символов, используйте %d напечатать его в виде десятичной (целое) номер:

printf("%d\n", s[10]); 

Обратите внимание, что конец строки не такой же, как конец строки, как сказано в одном из ваших комментариев. Конец строки означает, что любая операция строки над символьной последовательностью должна останавливаться при достижении первого \0. Если последовательность символов имеет что-то еще после \0, она не будет напечатана, потому что операция строки останавливается на первом знаке \0.

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

Если вы хотите иметь вектор полный конец строки символов (и напечатать их в качестве таковых), вы должны переместить вектор и заполнить его:

char s[256]; 
int i; 

for (i = 0; i < 256; ++i) 
    s[i] = '\n'; 

printf("%c\n", s[10]); 

В ASCII (числовое десятичное /) значение в конце строки (\n) составляет 12, поэтому, следующий фрагмент кода будет эквивалентно:

char s[256]; 
int i; 

for (i = 0; i < 256; ++i) 
    s[i] = 12; 

printf("%c\n", s[10]); 

это не работает, однако (не печатает новую строку):

char s[256] = {'\n'}; // or {12}; 

printf("%c\n", s[10]); 

, потому что эффект {'\n'} является назначение \n к первому элементу массива, а Остатки, 255 символов не заполняются значением 0, независимо от того, какой тип массива вы делаете (char[], int[] или любой другой). Если вы пишете пустую пару скобок {}, все элементы будут равны 0.

Таким образом, эти два утверждения эквивалентны:

char s[256] = {}; // Implicit filling to 0. 
char s[256] = {0}; // Implicit filling to 0 from the second element. 

Однако без определения массива:

char s[256]; 

Массив не заполняется (не инициализирован), поэтому каждый элемент s будет иметь что угодно, пока вы не заполните его значениями, например, с помощью for.

Надеюсь, что на всех этих примерах вы получите всю картину.

+0

Спасибо! Я печатал новую линию, так что это сводило меня с ума ... не мог понять, почему ничего не печатается, пока я ожидал 0 –

+0

@TonyTannous Edited. –