Your truncate
function doesn't add the required nul
terminator character to the destination (s2
) string. Thus, when you call cout
in main
, that will keep printing characters until it finds its expected nul
(zero) character at some unspecified location following the garbage-initialized data that pre-exists in the parts of the s2
local array that weren't explicitly set by your function. (This is undefined behaviour, and almost anything could actually be displayed; the program may also crash, if the cout
call tries to read memory it doesn't have the required access to).
To correct this, simply add that nul
(zero, or '\0'
) character to the end of the string in the truncate
function. Assuming you don't go beyond the array's bounds, you can use the "left over" value of the loop index, i
, to access the required element; but, to do so, you will need to declare the int i
outside of the for
loop's scope:
void truncate(char* s1, char* s2, int n)
{
int i; // Must be declared outside the FOR loop ...
for (i = 0; i < n; i++) {
s2[i] = s1[i];
}
s2[i] = '\0'; // ... so we can use it here.
}
Note: Another way (but apparently prohibited by your teacher) would be to set all elements of the s2
array in main
to zero, before calling your truncate
function:
char s2[10] = ""; // Set ALL elements to zero
Some compilers (seemingly including the online one you use) will "implicitly" set the elements of uninitialized local arrays to zero; but never rely on this: it is not part of the C++ Standard and compilers are not required to enforce such behaviour.