Can someone outline the "best practice" (if any!) to handle newline in ANSI-C standard library functions?
I had some confusion with these functions recently related to char array and char pointer.
puts(), printf(), strcpy(), strncpy(), memset().
I seem to understand their basic use, but got quite confused on some situations.
#include <stdio.h>
#include <string.h>
//Some said don't use strcpy() but use strncpy()!!!
int main () {
char str1[128];
char str2[256];
int len1, len2;
// strcpy(str1, "this is string1");
// strcpy(str2, "That is test string2");
len1=strlen("this is string1");
len2=strlen("That is test string2");
//memset(str1, '\0', sizeof(str1)); //why is it needed?
strncpy(str1, "this is string1", len1);
strncpy(str2, "That is test string2", len2);
puts("___Line 1___");
puts(str1);
puts("___Line 2___");
puts(str2);
return (0);
}
1) For unknown reason, sometime I got output:
this is string10That is test string2
That is test string2.
With the memset() function inserted, I always got the correct output. But, I do not see memset() is combined with these strncpy()/strcpy() very often.
2) The 4 puts() are in a row, but sometime they gave extra blank line that seems come from extra newline (especially in the next example), but I read puts() only appends newline at the end.
Here is another example where I tested with printf() and puts():
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//Tried from scratch combining const/strlen/malloc/'\0' concepts
void swap(char* s1, char* s2) {
*s1 = *s1 ^ *s2;
*s2 = *s2 ^ *s1;
*s1 = *s2 ^ *s1;
}
char* str_reverse_in_place_by_swap(char* str){
int len = strlen(str);
char* start = str;
char* end = start + len - 1; //-1 for '\0'; Made a mistake: char* end = start + len
;
while(start < end )
{
swap(start, end);
++start;
--end;
}
return str;
}
int main(int argc, char *argv[])
{
char* string1 = malloc(256*sizeof(char)); //first allocate 256 bytes long
printf("Type a String to reverse it[max. 255 chars]:\n");
if (fgets(string1, 256, stdin) == NULL)
printf("Error! Non-empty string is needed!\n");
char* str3 = malloc( (strlen(string1)+1) * sizeof(char) );
printf("Before reverse string1(which should be empty!): %s\n", str3);
printf("By reverse_in_place_by_swap():");
// str3 = str_reverse_in_place_by_swap(string1);
// puts(str_reverse_in_place_by_swap(string1));
printf("%s\n", str_reverse_in_place_by_swap(string1));
free(str3);
return EXIT_SUCCESS;
}
I must have missed important rules to use these functions.
so I'm asking my question with "best practice" to narrow down my struggle if that is reasonable. Thanks.