Указатели и копирование в массив ? Начинающий.
От: Mr-Twister http://cosmozo.narod.ru/
Дата: 12.03.02 09:22
Оценка:
Сделал программку
#include <stdio.h>
#include <string.h>
char *fi( char * fu, const char * fa, int ee);
int main(void)
{
 int number=6;
 char s1[20], * s2= "Pruvetiche", *s3;
 s3 = fi ( s1, s2 , number);
 puts(s3);
 return 0;
}
char *fi( char * fu, const char * fa, int ee)
{
 strncpy( fu, fa, ee );
 return fu;
}

Но не пойму почему во время выполнения в конце вылетает значок @.
Хотелось бы чтоб копировалось только 6 указанных букв. Без этих залетных значков @.
Подскажите что не правильно, в принципе программа работает.
дас ист нихьт фантастиш, дас ист руссиш Ванюшка
Re: Указатели и копирование в массив ? Начинающий.
От: Lexey Россия  
Дата: 12.03.02 09:32
Оценка: 4 (2)
Здравствуйте Mr-Twister, Вы писали:

MT>Сделал программку

MT>
MT>#include <stdio.h>
MT>#include <string.h>
MT>char *fi( char * fu, const char * fa, int ee);
MT>int main(void)
MT>{
MT> int number=6;
MT> char s1[20], * s2= "Pruvetiche", *s3;
MT> s3 = fi ( s1, s2 , number);
MT> puts(s3);
MT> return 0;
MT>}
MT>char *fi( char * fu, const char * fa, int ee)
MT>{
MT> strncpy( fu, fa, ee );
MT> return fu;
MT>}
MT>

MT>Но не пойму почему во время выполнения в конце вылетает значок @.

Потому, что strncpy не добавляет в конец строки \0, если копируемое число символов меньше длины копируемой строки.

MT>Хотелось бы чтоб копировалось только 6 указанных букв. Без этих залетных значков @.


char *fi( char * fu, const char * fa, int ee)
{
  strncpy( fu, fa, ee );
  *(fu+ee)=0;
  return fu;
}
"Будь достоин победы" (c) 8th Wizard's rule.
Re: Указатели и копирование в массив ? Начинающий.
От: Vi2 Удмуртия http://www.adem.ru
Дата: 12.03.02 09:34
Оценка: 3 (1)
Здравствуйте Mr-Twister, Вы писали:

MT>char *fi( char * fu, const char * fa, int ee)

MT>{
MT> strncpy( fu, fa, ee );
MT> return fu;
MT>}
MT>Но не пойму почему во время выполнения в конце вылетает значок @.
MT>Хотелось бы чтоб копировалось только 6 указанных букв. Без этих залетных значков @.
MT>Подскажите что не правильно, в принципе программа работает.

Наверное, потому, что strncpy не пишет 0 в конец строки.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re: Указатели и копирование в массив ? Начинающий.
От: Anatolix Россия https://www.linkedin.com/in/anatolix/
Дата: 12.03.02 09:42
Оценка: 3 (1)
Здравствуйте Mr-Twister, Вы писали:

MT>Сделал программку


Из help на strncpy:

If count is less than or equal to the length of strSource, a null character is not appended automatically to the copied string.

Т.е. у тебя после копирования строка не завершается нулем.
И там может быть все что угодно включая @
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Re[2]: Указатели и копирование в массив ? Начинающий.
От: Mr-Twister http://cosmozo.narod.ru/
Дата: 12.03.02 09:42
Оценка:
Здравствуйте Lexey, Вы писали:
Ага, тогда понял.
Благодарю Lexey.
дас ист нихьт фантастиш, дас ист руссиш Ванюшка
Re[2]: Указатели и копирование в массив ? Начинающий.
От: Mr-Twister http://cosmozo.narod.ru/
Дата: 12.03.02 09:45
Оценка:
Здравствуйте Vi2, Вы писали:

Благодарю,Vi2 и Anatolix, Вы правы.
Спасибо Всем!!!
дас ист нихьт фантастиш, дас ист руссиш Ванюшка
Re: Указатели и копирование в массив ? Начинающий.
От: lozzy  
Дата: 12.03.02 09:46
Оценка: 2 (1)
Здравствуйте Mr-Twister, Вы писали:

Skipped

Итак, читаем MSDN:
The strncpy function copies the initial count characters of strSource to strDest and returns strDest. If count is less than or equal to the length of strSource, a null character is not appended automatically to the copied string. If count is greater than the length of strSource, the destination string is padded with null characters up to length count. The behavior of strncpy is undefined if the source and destination strings overlap.

Это означает, что если размер строки копируемой меньше размера строки, в которую копируем, то null-character не добавляется автоматически. Поэтому и возникают зюки. Что примечтельно, lstrcpyn делает все правильно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.