Now I'm using this code to delete some char in a string.
void eliminate(char *str, char ch){
for(; *str != '\0';str++){
if(*str == ch){
strcpy(str, str+1);
str--;
}
}
}
In the char *str there are some strings like
"sll $6, $5, 16"
After deleting "$", the string looks like this.
"sll 6, 5, 16"
But after deleting ",", the string became very strange.
"sll 6 5 6"
Is there any problem with the code above? And also, it only happens in Linux and online GDB. VS code in my window laptop eliminates the targeted char very well.
As pointed out in comments strcpy()
is not safe when coping data with overlapping memory blocks. memmove(dst, src, len)
is the alternative which uses an auxiliary buffer in case of src
& dst
memory overlaps.
You can simply skip the character to eliminate in a loop:
#include <stdio.h>
void drop_char (char *str, char ch) {
if (!str) return;
for(char* cp = str; 1 ; ) {
if(*cp != ch)
*str++ = *cp;
if ('\0' == *cp++)
break;
}
}
int main () {
char str [] = "sll $6, $5, 16";
printf ("Original : [%s]", str);
drop_char(str, '$');
printf ("\nDropping $ : [%s]", str);
drop_char(str, ',');
printf ("\nDropping , : [%s]", str);
printf ("\n");
return 0;
}