функция strncpy не работает для меня правильно

Я только начинаю на C ++, поэтому я могу допустить глупую ошибку. Ниже мой код вместе с выводами в комментариях. Я использую Xcode.

#include <iostream>
#include <string.h>

using namespace std;

int main() {

char myString[] = "Hello There";
printf("%s\n", myString);

strncpy(myString, "Over", 5); // I want this to print out "Over There"
cout<< myString<<endl; // this prints out ONLY as "Over"
for (int i = 0; i <11; i++){
cout<< myString[i];
}// I wanted to see what's going on this prints out as Over? There
// the ? is upside down, it got added in

cout<< endl;
return 0;
}

0

Решение

ЭТА ПРОБЛЕМА

  • strncpy (destination, source, max_len)

strncpy определяется для копирования не более max_len персонажи из source в destination, в том числе завершающий нулевой байт, если source не содержит нулевой байт в первом max_len байт.

В вашем случае завершающий нулевой байт будет в том числе, и с этим destination будет прекращен сразу после "Over"Вот почему вы видите описанное поведение.

После вашего звонка strncpy myString поэтому будет сравниваться равным:

"Over\0There"

РЕШЕНИЕ

Наиболее простым решением было бы не копировать завершающий нуль-байт из "Over"что так же просто, как указать 4 вместо 5 в strncpy:

strncpy(myString, "Over", 4);
1

Другие решения

Документация для strncopy выглядит следующим образом:

char * strncpy ( char * destination, const char * source, size_t num );

Копирует первые num символов источника в место назначения. Если конец
исходной строки C (которая сигнализируется нулевым символом)
найдено до того, как скопировано num символов, место назначения заполнено
с нулями, пока не будет записано всего num символов.

По телефону strncpy(myString, "Over", 5), вы на самом деле копируете «Over \ n» в myString. Возможно, вам лучше вызывать strncpy с последним параметром как strlen (source).

1

Попробуйте следующее

#include <iostream>
#include <string.h>

using namespace std;

int main() {

char myString[] = "Hello There";
printf("%s\n", myString);

strncpy(myString, "Over", 4); // I want this to print out "Over There"strcpy( myString + 4, myString + 5 );

cout<< myString<<endl; // this prints out ONLY as "Over"
for (int i = 0; i <10; i++){
cout<< myString[i];
}// I wanted to see what's going on this prints out as Over? There
// the ? is upside down, it got added in

cout<< endl;

return 0;
}
1
По вопросам рекламы [email protected]