Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Копирование строки


Автор: RomanK 25.8.2011, 17:11
Я новичек в С++. Ни как не получается сделать одну вещь и не понимаю почему происходит не то, что я хочу. Я хочу только лишь получить строку, которая будет состоять из уже существующей строки, плюс еще что-нибудь!

Вобщем есть код:

Код

char str1[3];
str1[0] = TEXT('A');
str1[1] = TEXT('B');
str1[2] = 0;

char str2[12];
strcpy( str2, str1 );
strcat( str2, "CDE" );


Вобщем по моей логике после этого кода в строке str1 должно оставаться "AB", а в строке str2 должно появится ABCDE. Но нихрена подобного. Почему-то из строки str1 исчезает AB! smile Как сделать чтобы не исчезало? Я ведь копирую из строки str1 в str2. А оно как будто вырезается. Я уже заколебался этот вопрос решать, часа 4 бьюсь, не могу решить!

Помогите пожалуйста.

Автор: hils 25.8.2011, 17:56
str1[2] = 0;

ты ноль зачем char'у присваиваешь? Конечно можно, но не ясна логика.
Если же ты хотел закончить строку, то тебе нужно использовать '\0'.

Автор: RomanK 25.8.2011, 18:05
hils, да я хотел строку закончить.
В этом ошибка????

Счас попробую....

Добавлено через 2 минуты и 59 секунд
hils, неа. Не в этом дело. Все равно исчезает!

Я сейчас заметил, что исчезает значение из str1, когда делаешь вот это:
Код

strcat( str2, "CDE" );

То есть когда делаешь первое копирование - все ок! Но при чем тут эта строка и str1? Значит проблема в адресах и т.п. В этом я вобще ньюб. Помогите пожалуйста, как сделать так, чтобы работало как я хочу!

Автор: rodnover 25.8.2011, 18:09
Код

str1[2] = 0;
str1[2] = '\0';


Это одно и то же. А случайно не юникодовая кодировка используется?

Если не сложно кинь значения переменных, которые после конкантенации получаются.

И попробовать вот так:

Код

char *str1 = "AB";

Автор: hils 25.8.2011, 18:16
На будущее всегда заканчивай строку управляющей символьно константой '\0', тогда строка будет считаться завершенной.

Код

char str1[3];
str1[0] = 'A';
str1[1] = 'B';
str1[2] = '\0';

char str2[12];
strcpy( str2, str1 );
strcat( str2, "CDE" );


на выходе строка str2 в которой "ABCDE" и str1 в которой "AB"

Автор: mes 25.8.2011, 18:20
Цитата(hils @  25.8.2011,  17:16 Найти цитируемый пост)
строку управляющей символьно константой '\0', тогда строка будет считаться завершенной.


Цитата(rodnover @  25.8.2011,  17:09 Найти цитируемый пост)
Код

str1[2] = 0;
str1[2] = '\0'

Это одно и то же


Добавлено через 1 минуту и 56 секунд
Цитата(RomanK @  25.8.2011,  16:11 Найти цитируемый пост)
 Ни как не получается сделать одну вещь и не понимаю почему происходит не то, что я хочу. 

описанная ошибка не соответсвует приведенному фрагменту кода.. 

Автор: volatile 25.8.2011, 23:44
Цитата(RomanK @  25.8.2011,  17:11 Найти цитируемый пост)
char str1[3];
str1[0] = TEXT('A');
str1[1] = TEXT('B');
str1[2] = 0;

char str2[12];
strcpy( str2, str1 );
strcat( str2, "CDE" );


Автор: RomanK 29.8.2011, 01:04
Всем большое спасибо. Разобрался со своей ошибкой.
В реальном таком коде (для моего случая) я ошибся в этой строке:

char str2[12];

Копируемая строка в эту переменную была больше чем 12 симоволов...

Добавлено через 3 минуты и 40 секунд
volatile, в С++ программировать только начинаю, и исходный пример был именно с TEXT('A'). Сам не понимаю нахрена этот TEXT нужен. У себя его убрал. Спасибо.
По мере программирования своей задачи удивило, что конструкция типа:
Код

char i;
for ( i = 'A'; i <= 'Z'; i ++)
{
    // It works.
}

Работает! smile 

Автор: bsa 31.8.2011, 16:57
Цитата(RomanK @  29.8.2011,  01:04 Найти цитируемый пост)
По мере программирования своей задачи удивило

Чем же? Тем, что с символами идет работа так же, как и с числами? Ну так символы это и есть числа. Просто на экран они выводятся особым образом.

Автор: volatile 1.9.2011, 00:33
Цитата(RomanK @  29.8.2011,  01:04 Найти цитируемый пост)
не понимаю нахрена этот TEXT нужен.

макрос TEXT() задуман мелкомягкими для написания программ, компилируемым одновременно и как юникодные и как не юникодные.
в юникодных он превращается: в L"sometext", в неюникодных: "sometext"

В вашем случае вы присваиваете техт переменной типа чар. Что в юникодной версии вызовет ошибку компиляции.
поэтому смысла здесь в макросе TEXT абсолютно нет.

ЗЫ: был бы смысл если бы было:
Код

TCHAR str1[3];
str1[0] = TEXT('A');
str1[1] = TEXT('B');
str1[2] = 0;

ну и все функции типа strcpy() заменить на соответствующие _tcscpy() и т.д...
(вообще всю программу перепахать изрядно бы пришлось)
Но так как этого нет, то и TEXT() не нужен.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)