我正在尝试编写一个函数来删除数组中的所有字符,除了”,’ – ‘,’*’,’/’和数字.这是我提出的代码:
void eliminateJunk(char string[MAX]){ int i,j; char stringOut[MAX]; int length = strlen(string) - 1; for(i=0; i <= length; i++){ if(string[i] != '+' && string[i] != '-' && string[i] != '*' && string[i] != '/' && !(isdigit(string[i]))){ for(j=i; j < length; j++){ string[j] = string[j+1]; } } } }
但是,该函数并不总是从c字符串中删除所有垃圾字符 – 它会获得大部分垃圾字符,但偶尔会留下一些.
输入示例:
123 123
123123
但是,在某些输入中,它会留下空间……
输入示例:
123 123
示例输出:
123 123
解决方法
这是你去的经典问题:在for循环之后你需要递减i,否则你跳过下一个字符.
但是,嵌套的for循环是不必要的:您可以通过维护单独的读写索引来完成整个事务.当您看到有效字符时,将其从读取位置移动到写入位置,并递增两个索引.当您看到无效字符时,请在不移动字符的情况下递增读取索引.在循环结束时终止字符串 – 你完成了!
int r,w; // r for "read",w for "write" for(r=0,w=0; r != length ; r++) { // Your condition is inverted if(string[r] == '+' || string[r] == '-' || string[r] == '*' || string[r] == '/' || (isdigit(string[r]))) { // No loop inside string[w++] = string[r]; } } // Add null terminator at the end string[w] = '\0';