Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
 массивы символов = строка  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 834
Добрый всем день.
Я понимаю, что кто-то сейчас скажет , что это полный анахронизм, но всё-таки.

Разбирая классику Керригана столкнулся с таким нюансом :
если я вот таким образом объявляю строковой массив и тут же его инициализирую :
char s[]="test\0";


char t[]="hello\0";


(или вот так char *s = "test\0";)

как я понимаю в этом случае автоматически происходит определение длины массива(строки). для первой объявляется массив длиной 4, а для второй 5.
Но если я хочу скажем (конечно, это не хорошо ) увеличить строку s , например сделав так:
    s[4] = 'g';
    s[5] = 'g';
    s[6] = 'g';
    s[7] = 'g';
    s[8] = 'g';
    s[9] = 'g';

то мало того , что строка s начнет добавляться символами, так с какого-то момента пострадает ещё и строка t , её символы тоже
с какого-то момента начнут правится на 'g'.
Вопрос в следующем : я верно понимаю , что "мне повезло" и ячейки массивов волшебным образом зарезервировались почти подряд : сначала массив s, а потом через некоторое количество байт и массив t и поэтому и происходит правка массива g?

я почему спрашиваю :
в учебнике с указателями в главе 5.5.
дается следующая инициализация :
char amessage[]="now is the time";
char *pmessage[]="now is the time";

а потом в домашке требуется написать функцию strcat(s,t), которая добавляет к строке s строку t.
так вот из логики теоретического материала хочется инициализацию сделать именно как дается в главе 5.5
Но сделать я должен что-то вроде этого :

char s[100]="test";


char t[6]="hello\0"; /*хотя тут длину можно и не указывать*/


Верно?
2 май 20, 12:14    [22126564]     Ответить | Цитировать Сообщить модератору
 Re: массивы символов = строка  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50076

andron81
я вот таким образом объявляю строковой массив и тут же его инициализирую :
char s[]="test\0";


Ты это нашёл у Кернигана или из пальца высосал?

Posted via ActualForum NNTP Server 1.5

2 май 20, 12:24    [22126571]     Ответить | Цитировать Сообщить модератору
 Re: массивы символов = строка  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 834
Dimitry Sibiryakov

andron81
я вот таким образом объявляю строковой массив и тут же его инициализирую :
char s[]="test\0";


Ты это нашёл у Кернигана или из пальца высосал?


50/50
у Керригана вот так :

char s[]="test";


это страшное преступление с моей стороны , что я добавил '\0' ?
2 май 20, 12:35    [22126580]     Ответить | Цитировать Сообщить модератору
 Re: массивы символов = строка  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50076

andron81
это страшное преступление с моей стороны

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

Posted via ActualForum NNTP Server 1.5

2 май 20, 12:46    [22126590]     Ответить | Цитировать Сообщить модератору
 Re: массивы символов = строка  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 834
Dimitry Sibiryakov

andron81
это страшное преступление с моей стороны

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


хорошо , признаю . мой косяк, обратить внимание надо. запомнил , однако :

char s[] = "test\0";
char t[] = "test";
int main()
{
	int c = 0, b = 0;
	c=strlen(s); //что тут 4
	b=strlen(t); //что тут 4
}

на мою проблему это не сильно влияет ? сумничал, обозвал недоумком, но по делу дальше гордыня не позволяет что-то сказать.
это пожалуй самая худшая ветка со всего сайта. собрание гениев - троллей .
2 май 20, 13:09    [22126597]     Ответить | Цитировать Сообщить модератору
 Re: массивы символов = строка  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50076

andron81
на мою проблему это не сильно влияет ?

Сильно. Попробуй sizeof().

Posted via ActualForum NNTP Server 1.5

2 май 20, 13:10    [22126599]     Ответить | Цитировать Сообщить модератору
 Re: массивы символов = строка  [new]
petrav
Member

Откуда:
Сообщений: 2118
andron81,

Ты зря тут добавляешь нулевой символ '\0'. Он добавляется "автоматически". Вот тут:

char s[] = "test";

Размер массива пять символов.
2 май 20, 13:41    [22126611]     Ответить | Цитировать Сообщить модератору
 Re: массивы символов = строка  [new]
petrav
Member

Откуда:
Сообщений: 2118
andron81,

А вот тут в массиве четыре символа и нулевого символа в конце массива нет.

char s[] = { 't', 'e', 's', 't' };
2 май 20, 13:44    [22126616]     Ответить | Цитировать Сообщить модератору
 Re: массивы символов = строка  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 834
Dimitry Sibiryakov

andron81
на мою проблему это не сильно влияет ?

Сильно. Попробуй sizeof().


да соглашусь, обратить внимание важно. на ус намотаю
то есть если делаю так :
	char s[100] = "hello\0"; // хотя \0 тут лишний
	int k = sizeof(s);//100 байт
	int l = strlen(s);//5

или так :
	char s[100] = "hello";
	int k = sizeof(s); //100 байт
	int l = strlen(s); //5


то всё тождественно.
Я верно понимаю, что в подобных задачах из Керригана обязательно лимитировать длину строки ?
и если она будет увеличиваться , то её надо резервировать по максимуму.
либо так :
char s[]=" 100 пробелов ";
либо
char s[100]="";

а подобные вещи
char s[]="test\0"; воспринимаются как массив не 4 символа , а 5.
2 май 20, 13:55    [22126625]     Ответить | Цитировать Сообщить модератору
 Re: массивы символов = строка  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 834
petrav
andron81,

char s[] = { 't', 'e', 's', 't' };




а вот это как раз неправильно ! длина такой строки не понять какая будет.

Сообщение было отредактировано: 2 май 20, 13:57
2 май 20, 13:58    [22126629]     Ответить | Цитировать Сообщить модератору
 Re: массивы символов = строка  [new]
petrav
Member

Откуда:
Сообщений: 2118
andron81
petrav
andron81,

char s[] = { 't', 'e', 's', 't' };




а вот это как раз неправильно !

Почему?
2 май 20, 13:59    [22126631]     Ответить | Цитировать Сообщить модератору
 Re: массивы символов = строка  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50076

andron81
длина такой строки

А это и не строка. Это массив символов. Внезапно, но в Си вообще нет строк.

Posted via ActualForum NNTP Server 1.5

2 май 20, 14:02    [22126632]     Ответить | Цитировать Сообщить модератору
 Re: массивы символов = строка  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 834
petrav
andron81
пропущено...


а вот это как раз неправильно !

Почему?


ну например уже потому что strlen(s); отработает неадекватно. она как я понимаю ориентируется на маркер '\0'
char s[] = { 't', 'e', 's', 't'};
int l = strlen(s);  //15
2 май 20, 14:03    [22126633]     Ответить | Цитировать Сообщить модератору
 Re: массивы символов = строка  [new]
petrav
Member

Откуда:
Сообщений: 2118
andron81
petrav
пропущено...

Почему?


ну например уже потому что strlen(s); отработает неадекватно. она как я понимаю ориентируется на маркер '\0'
char s[] = { 't', 'e', 's', 't'};
int l = strlen(s);  //15

Конечно, потому что это уже не строка, а массив символов. А до этого был массив символов содержащий строку.
2 май 20, 14:08    [22126636]     Ответить | Цитировать Сообщить модератору
 Re: массивы символов = строка  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 834
petrav
andron81
пропущено...


ну например уже потому что strlen(s); отработает неадекватно. она как я понимаю ориентируется на маркер '\0'
char s[] = { 't', 'e', 's', 't'};
int l = strlen(s);  //15

Конечно, потому что это уже не строка, а массив символов. А до этого был массив символов содержащий строку.


ну юридически в общем смысле да. Верно ! я не прав. но в данном контексте подразумевались всё же строки.
Ладно, понял. спасибо

Сообщение было отредактировано: 2 май 20, 14:15
2 май 20, 14:12    [22126639]     Ответить | Цитировать Сообщить модератору
 Re: массивы символов = строка  [new]
Алексей Роза
Member

Откуда: РФ
Сообщений: 201
char s0[5] = "abcd\n"; // error: initializer-string for array of chars is too long
char s1[5] = "abcd"; // тут автоматом есть \0
char* s2[5] = {"abcd\n"};
printf("sizeof(s1) = %d;\nstrlen(s1) = %d;\nsizeof(s2) = %d;\nstrlen(s2) = %d;\n"
        ,sizeof(s1), strlen(s1), sizeof(*s2), strlen(*s2));
/*
sizeof(s1) = 5;
strlen(s1) = 4;
sizeof(s2) = 8;
strlen(s2) = 5;
*/

короче, юзай C++ и string.

Сообщение было отредактировано: 2 май 20, 14:57
2 май 20, 14:54    [22126656]     Ответить | Цитировать Сообщить модератору
Все форумы / C++ Ответить