2014-10-13 2 views
0

Я изучаю C. Некоторые символы автоматически добавляются в мою программу. Что я делаю не так?Неизвестные ошибочные символы добавляются к строкам?

#include <stdio.h> 
#include <string.h> 

int main() { 
    char test1[2]="xx"; 
    char test2[2]="xx"; 
    printf("test is %s and %s.\n", test1, test2); 
    return 0; 
}        

Вот как я бегу это на Fedora 20.

gcc -o problem problem.c 
./problem 
test is xx?}� and [email protected] 

Я хотел бы ожидать, что ответ будет test is xx and xx.

ответ

2

Вопрос заключается в том, что строковые литералы, такие как "xx" имеют дополнительный характер, который является NUL-терминации, \0, то есть она состоит из символов 'x', 'x' и '\0'.

Это то, как функции, которые принимают char* и обрабатывают их как строки, знают степень строк. Ваши массивы являются просто одним элементом слишком коротким, не хватает nul-terminator. Передавая char*, которые не указывают на строку с нулевым завершением на функцию, которая ее ожидает, вы вызываете неопределенное поведение.

Вы можете инициализировать их, как это вместо:

char test[] = "xx"; 

Это приведет к test, имеющие правильную длину 3. Вы можете проверить это с помощью оператора sizeof. Разумеется, вы также можете указать на длину:

char test[3] = "xx"; 

, но это более подвержено ошибкам.

+0

Спасибо, что сделал трюк. Разве я не должен объявлять количество символов? –

+0

@donniezazen Да, вы можете (см. Мое последнее редактирование). Но вы должны все исправить! – juanchopanza

+0

Этот 'char test1 [3] =" xx \ 0 ";' также работает. Благодарю. –

2

При определении строки в C, как этот

char A[] = "hello"; 

Он получает инициализирован что-то вроде этого

A = { 'h', 'e', 'l', 'l', 'o', '\0'} 

, что в прошлом нулевой символ необходим для того, чтобы быть строкой. Так что в вашем коде

char test1[2]="xx"; 

Вы сделали массив символов test1 быть 2 символов, не оставляя места для нулевого символа.

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

char test1[]="xx"; 

Или дать еще один то символов, которые вы заполняете, как

char test1[3]="xx"; 
1

В вашем коде char test1[2]="xx", char test1[2] создает вид «контейнер» для двух символов, но фактическая строка "xx" неявно имеет три символа xx0, где 0 указывает конец строки. Этот 0 является индикатором для printf, где он должен прекратить чтение входной строки. В вашем случае printf не получает это 0, поскольку 0 не вписывается в test1, и он читает некоторый случайный ноль в памяти, печатая все, что он встречает на этом пути.

Вы должны изменить свое заявление на следующее:

char test1[3]="xx" 
Смежные вопросы