Use a function to trim trailing chars:
// tChars = "\r\n"
// You can alter it to return trimmed string length
static inline char*
trim_chars (char* const aPtr, const size_t aLen, const char *tChars) {
if (!aPtr || aLen < 1 || !tChars) return aPtr;
char *zPtr = aPtr + aLen - 1; // last character
//Trimming trailing characters
while (zPtr >= aPtr && strchr (tChars, (unsigned char) *zPtr))
--zPtr;
*(zPtr + 1) = '\0';
return aPtr;
}
To test it :
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAX_TEST_STR 12
#define MAX_STR_LEN 16
#define TRIM_TRAIL_CHARS "\r\n"
int main () {
char str[MAX_TEST_STR][MAX_STR_LEN] = {
"Test1 \n",
"Test2 \n\n",
"Test3 \r\n",
"Test4 \n\r",
"Test5 \n\r\r\r",
"Test6 \n\r\n\r",
"\n\r\n\r",
"\r\n\r\n",
"\r",
"\n",
"\r\n",
"\n\r"
};
for (int si = 0; si < MAX_TEST_STR; ++si) {
char * tstr = trim_chars(str[si], strlen(str[si]), TRIM_TRAIL_CHARS);
printf ("%2d : [%s] len : %lu\n", si+1, tstr, strlen(tstr));
}
return 0;
}
And the trail-trimmed strings :
1 : [Test1 ] len : 6
2 : [Test2 ] len : 6
3 : [Test3 ] len : 6
4 : [Test4 ] len : 6
5 : [Test5 ] len : 6
6 : [Test6 ] len : 6
7 : [] len : 0
8 : [] len : 0
9 : [] len : 0
10 : [] len : 0
11 : [] len : 0
12 : [] len : 0
What if getline()
returns with embedded \n
in strings on windows & embedded \r
on linux? Go for strcspn()
& handle the split string accordingly.