powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / массивы символов = строка
16 сообщений из 16, страница 1 из 1
массивы символов = строка
    #39953679
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый всем день.
Я понимаю, что кто-то сейчас скажет , что это полный анахронизм, но всё-таки.

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



Код: plaintext
1.
char t[]="hello\0";



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

как я понимаю в этом случае автоматически происходит определение длины массива(строки). для первой объявляется массив длиной 4, а для второй 5.
Но если я хочу скажем (конечно, это не хорошо ) увеличить строку s , например сделав так:
Код: plaintext
1.
2.
3.
4.
5.
6.
    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
Но сделать я должен что-то вроде этого :

Код: plaintext
1.
char s[100]="test";



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



Верно?
...
Рейтинг: 0 / 0
массивы символов = строка
    #39953682
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81я вот таким образом объявляю строковой массив и тут же его инициализирую :
Код: sql
1.
char s[]="test\0";



Ты это нашёл у Кернигана или из пальца высосал?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
массивы символов = строка
    #39953684
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

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



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


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

Код: plaintext
1.
char s[]="test";



это страшное преступление с моей стороны , что я добавил '\0' ?
...
Рейтинг: 0 / 0
массивы символов = строка
    #39953688
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81это страшное преступление с моей стороны

Это признание в том, что ты книгу читал по диагонали, не используя мозг.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
массивы символов = строка
    #39953694
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

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

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


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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
char s[] = "test\0";
char t[] = "test";
int main()
{
	int c = 0, b = 0;
	c=strlen(s); //что тут 4
	b=strlen(t); //что тут 4
}


на мою проблему это не сильно влияет ? сумничал, обозвал недоумком, но по делу дальше гордыня не позволяет что-то сказать.
это пожалуй самая худшая ветка со всего сайта. собрание гениев - троллей .
...
Рейтинг: 0 / 0
массивы символов = строка
    #39953696
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81на мою проблему это не сильно влияет ?

Сильно. Попробуй sizeof().
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
массивы символов = строка
    #39953705
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81,

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

Код: plaintext
1.
char s[] = "test";


Размер массива пять символов.
...
Рейтинг: 0 / 0
массивы символов = строка
    #39953707
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81,

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

Код: plaintext
1.
char s[] = { 't', 'e', 's', 't' };
...
Рейтинг: 0 / 0
массивы символов = строка
    #39953709
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

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

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


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


или так :
Код: plaintext
1.
2.
3.
	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.
...
Рейтинг: 0 / 0
массивы символов = строка
    #39953711
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
andron81,

Код: plaintext
1.
char s[] = { 't', 'e', 's', 't' };





а вот это как раз неправильно ! длина такой строки не понять какая будет.
...
Рейтинг: 0 / 0
массивы символов = строка
    #39953712
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
petrav
andron81,

Код: plaintext
1.
char s[] = { 't', 'e', 's', 't' };





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

Почему?
...
Рейтинг: 0 / 0
массивы символов = строка
    #39953713
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81длина такой строки

А это и не строка. Это массив символов. Внезапно, но в Си вообще нет строк.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
массивы символов = строка
    #39953714
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
andron81
пропущено...


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

Почему?


ну например уже потому что strlen(s); отработает неадекватно. она как я понимаю ориентируется на маркер '\0'
Код: plaintext
1.
2.
char s[] = { 't', 'e', 's', 't'};
int l = strlen(s);  //15
...
Рейтинг: 0 / 0
массивы символов = строка
    #39953715
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
petrav
пропущено...

Почему?


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


Конечно, потому что это уже не строка, а массив символов. А до этого был массив символов содержащий строку.
...
Рейтинг: 0 / 0
массивы символов = строка
    #39953718
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
andron81
пропущено...


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


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


ну юридически в общем смысле да. Верно ! я не прав. но в данном контексте подразумевались всё же строки.
Ладно, понял. спасибо
...
Рейтинг: 0 / 0
массивы символов = строка
    #39953722
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / массивы символов = строка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]