Я только начинаю на 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;
}
ЭТА ПРОБЛЕМА
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);
Документация для 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).
Попробуйте следующее
#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;
}