如何从C字符串中删除“垃圾输入”?

我正在尝试编写一个函数删除数组中的所有字符,除了”,’ – ‘,’*’,’/’和数字.这是我提出的代码
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';

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...