Sometimes things get easier if you don't use pointers, but offsets. The strspn () and strcspn () libraries work more or less to use offsets, and do a great job of ending the line.
#include <stdio.h> #include <string.h> size_t revword(char *str); void revmem(void *ptr, size_t len); size_t revword(char *str) { size_t pos,len; for (pos=len=0; str[pos]; pos += len) { len = strspn( str+pos, " \t\n\r"); if (len) continue; len = strcspn( str+pos, " \t\n\r"); if (!len) continue; revmem( str+pos, len ); } revmem( str, pos ); return len; } void revmem(void *ptr, size_t len) { size_t idx; char *str = (char*) ptr; if (len-- < 2) return; for (idx = 0; idx < len; idx++,len--) { char tmp = str[idx]; str[idx] = str[len]; str[len] = tmp; } } int main (int argc, char **argv) { if (!argv[1]) return 0; revword(argv[1] ); printf("'%s'\n", argv[1] ); return 0; }
wildplasser
source share