I aim to copy source
string to dest
string. If i compile the following program:
#include <stdio.h>
int main(void) {
char dest[6];
char source[6];
strcpy(dest,source);
while (*dest) { printf("%c",*dest++); }
while (*source) {printf("%c",*source++); }
return 0;
}
I get a runtime error. I suspect it is because strcpy
copies from source to destination till it encounters \0
. It did not,however,encounter the null character and kept on copying from the buffer till the runtime error occurred. To solve this problem, i modified the code as follows:
#include <stdio.h>
int main(void) {
char dest[6];
char source[6];
memset(dest, '\0', 6*sizeof(dest)); //trying to set dest to '/0'
strcpy(dest,source);
while (*dest) { printf("%c",*dest++); }
while (*source) {printf("%c",*source++); }
return 0;
}
i get the following errors:
prog.c:11:38: error: lvalue required as increment operand
while (*dest) { printf("%c",*dest++); } ^
and
prog.c:11:38: error: lvalue required as increment operand
while (*dest) { printf("%c",*source++); } ^
Why does this happen?
For starters it is the source array that shall be zero terminated if you are going to copy it in another character arrays using the standard C function strcpy. So instead of this statement
memset(dest, '\0', 6*sizeof(dest));
you should at least write
memset(source, '\0', 6*sizeof(source));
^^^^^^ ^^^^^^^
However even this statement is wrong because it overwrites the memory allocated for the array. sizeof( source )
is already equal to 6 bytes as it is followed from the array declaration
char source[6];
Thus you have to write
memset(source, '\0', sizeof(source));
^^^^^^^^^^^^^
In fact there was enough to write either like
char source[6] = { '\0' };
or like
char source[6] = "";
or like
char source[6];
source[0] = '\0';
Arrays are non-modifiable lvalues. Thus you may not write for example the following way
while (*dest) { printf("%c",*dest++); }
Instead of this statement you could write
for ( char *p = dest; *p; ++p ) { printf("%c", *p); }
Take into account that nothing will be outputted because the array contains an empty string. You could initialize the source array with some non-empty string literal.