2014-12-14 2 views
-2

У меня есть несколько вопросов, которые я хотел бы уточнить, о cstrings:куча вопросов о CString С ++

1) Инициализация: При объявлении массива символов следующим образом, делает C++ автоматически определяет его как CString? или (как я считаю) массив символов?

char a[10];

Другими словами, это массив символов, содержащих только нуль-терминатор («\ 0»), или это пустой массив символов?

2) При работе непосредственно с индексами cstring (i.e. a[i] = ch+1;), cstring автоматически заботится о своем нулевом терминаторе, или это ответственность программиста оставить для этого место и вставить его?

Пример кода (Это то, что я считаю правильный ответ):

char a[10]; 
int i = 0; 
cin.get(ch); 

while(ch != '\n' || i < 9) { 
    a[i] = ch; 
    counter++; 
    cin.get(ch); 
} 
a[i] = '\0'; //either the last index(9) 
       //or the one right after the 
       //last input will be set to '\0' 

3) При использовании <cstring> библиотеки (например, strncpy, strncat и т.д.), это заботиться о нулевой терминатор? Пример:

char myCstring[] = "I am a cstring"; //size of 15 (including '\0' at i == 14) 
strncpy(myCstring, "I am NOT a string object", 14); 

Будет ли это результатом следующего массива?

| I | | a | m | | N | O | T | | a | | s | t | r | '\0' | 
    0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 

И, наконец:

char myCstring[] = "I am a cstring"; //size of 15 (including '\0' at i == 14) 
strncpy(myCstring, "I'ma cstring", 14); 

Будет ли этот результат в следующем массиве?

| I | ' | m | a | | c | s | t | r | i | n | g | '\0' |x|x| 
    0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 

Извините за беспорядок.

+0

Один вопрос на вопрос, пожалуйста. – Veedrac

+2

C и C++ не имеют формальной концепции «C-строки»; С-строка - это не что иное, как массив символов с 0 байтом, помещенным после последнего допустимого символа в строке. –

+0

@remyabel: Что обычно называют «cstring», это то, что стандарт C вызывает «строку». Это по определению «непрерывная последовательность символов, заканчивающихся и включающая первый нулевой символ». Строковый литерал - это что-то еще; это конструкция в исходном коде C или C++, тогда как строка - это то, что существует во время выполнения программы. –

ответ

0

1) Это массив из chars, который обычно представляет собой 8-битные целые числа.

2) Нет, он рассматривается как массив - все работает точно так же, как и для массива int.

3) Многие считают, что strncpy небезопасно - он добавляет символ «\ 0» в конце строки, но не тогда, когда строка усечена, похожая на ваш случай. Полученный массив будет выглядеть так:

| I | | a | m | | N | O | T | | a | | s | t | r | '\0' | 
    0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 

волочить «\ 0» не был бы там, если вы прошли 15 по размеру, хотя, она есть только потому, что функция сказали массив закончилась 1 символ короткая. Если вы прошли sizeof(myCstring) как размер, результат будет отличаться:

| I | | a | m | | N | O | T | | a | | s | t | r | i | 
    0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 

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

4) Да, как поясняется в пункте 3.

+0

Исправлена ​​моя глупая ошибка, теперь должно быть правильно. – Kelm

+0

Итак, после ограничительного аргумента (даже если он передает размер массива) будет помещен '' \ 0'', или последний символ, когда 'string_argument

+0

Нет, он полностью опустит его, если не хватает места для копирования всей строки. В этом случае вы не заметите этого, потому что последний символ уже «\ 0», и вы передаете размер «size - 1» в качестве размера массива. Я отредактировал и, надеюсь, сделал это более ясным. – Kelm

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