2015-04-27 5 views
0

Я должен использовать строку специальных символов, таких как: !,",#,~ и т.д.Строка специальных символов

Если я:

char arr[10] = "''''''''''"; 
char arr1[10] = "!!!!!!!!!!"; 
char arr2[10] = "##########"; 
printf("%s\t%s\t%s\n",arr,arr1,arr2); 

затем printf печатает строку, и некоторые из мусора.

Где я ошибаюсь?

+5

Вы, вероятно, не читали предупреждение о компиляторе о «избыточном элементе инициализатора» или что-то в этом роде. (подсказка: строки C заканчиваются на 0.) –

ответ

4

Маски символов (также называемые строками C) имеют нулевое завершение, поэтому вам нужен дополнительный индекс в массиве для хранения нулевого символа. Если вам нужна строка из 10 символов, необходимо создать строку, которая может хранить 11 символов (дополнительный символ для нулевого символа '\0')

Таким образом, изменить свой код

char arr[11] = "''''''''''"; 
char arr1[11] = "!!!!!!!!!!"; 
char arr2[11] = "##########"; 
printf("%s\t%s\t%s\n",arr,arr1,arr2); 

или даже лучше , как это было предложено @TheParamagneticCroissant, вы можете сделать

char arr[] = "''''''''''"; 
char arr1[] = "!!!!!!!!!!"; 
char arr2[] = "##########"; 
printf("%s\t%s\t%s\n",arr,arr1,arr2); 

с этим, компилятор узнает длину самостоятельно.

+3

Еще лучше, 'char arr [] =" ... ";' и компилятор будет определять размер автоматически. –

+0

@ TheParamagneticCroissant, да, это лучше. –

+0

Если вы укажете, что строки должны быть ровно 10 символов, не более, не меньше, а затем введите: 'char arr [10 + 1]'. Самодокументирующий код. – Lundin

1

Вам нужен один байт пространства больше для NUL характера:

char arr[11] = "''''''''''"; 
char arr1[11] = "!!!!!!!!!!"; 
char arr2[11] = "##########"; 
printf("%s\t%s\t%s\n",arr,arr1,arr2); 

Или просто:

char arr[] = "''''''''''"; 
char arr1[] = "!!!!!!!!!!"; 
char arr2[] = "##########"; 
printf("%s\t%s\t%s\n",arr,arr1,arr2); 
1

Я надеюсь, что вы получили ответ на свой вопрос, однако, только чтобы прояснить вещи немного больше, для %s спецификатор формата в printf(), в соответствии с C11 стандартного документа, глава §7.21.6.1,

s

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

Это означает, что указатель аргумент поставляются для %s, должен быть указателем на char, имеющий null, в конце концов, чтобы отметить конец из-массива. Таким образом, завершается нулем char массива считаются струны в С.

Теперь, возвращаясь к вашему делу,

char arr[10] = "''''''''''"; 

у вас есть ровно 10 инициализатору к 10-элементного char массиве. таким образом, нет места для нуль-termiantor. Когда вы используете sypplu базовый адрес этого массива в качестве аргумента для printf(), который будет использоваться для %s, printf() не знает, где остановиться, чтобы читать за пределами выделенной памяти, которая в свою очередь вызывает undefined behaviour.

Решение:

  1. Оставьте распределение размера компилятора, лучший подход.

    char arr[] = "''''''''''"; 
    
  2. или, по крайней мере, выделить достаточно памяти, так что нуль-termiantor может быть размещен.

    char arr[11] = "''''''''''"; //10 elements + 1 null 
    

Пожалуйста, сделайте то же самое для arr1 и arr2 также.

+0

Сэр !!!! Ваш случай, который я пробовал, но он дает значение для мусора вместе со строкой. Во-вторых, все хорошо. –

+0

@AbhijatyaSingh Вы делали то же самое для всех массивов? –

+0

Да, сэр !!!! Случай 1 не работает, но случай 2 работает нормально. –

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