为什么我的功能没有删除所有号码?

jtu*_*lan 0 c arrays numbers char

我创建了一个函数,可以在数组中找到任何数字并删除它们.这是我的代码:

int noNums (char *a) {
  int i;
  int deleteInd;
  for (i = 0; (i < MAX_NAME_SZ) && (a[i] != '\0'); i++) {
      if ((a[i] >= '0') && (a[i] <= '9')) {
      deleteInd = i;
      memmove (&a[deleteInd], &a[deleteInd + 1], strlen (a) - deleteInd);
      }
  }
}
Run Code Online (Sandbox Code Playgroud)

如果一个数字本身就在char数组中,则它被删除,没问题.但是,如果数组中有连续的数字,那么只会删除其他所有数字?

如果我的char数组有

w12345678

然后将数组更改为

w2468

代替

w ^

有任何想法吗?

Bar*_*mar 5

执行此操作后memmove(),下一个元素现在位于刚刚删除的元素的索引中.但是你的循环会这样做i++,所以你不会再次检查那个索引.因此,只要一行中有两个数字,就跳过第二个数字.

解决此问题的一种方法是从数组的末尾循环到开头,而不是从开头到结尾.

另一种方法是在做完i--之后做memmove(),以抵消i++循环将要做的事情.

  if (isdigit(a[i]) {
      deleteInd = i;
      memmove (&a[deleteInd], &a[deleteInd + 1], strlen (a) - deleteInd);
      i--;
  }
Run Code Online (Sandbox Code Playgroud)

顺便说一下,你应该isdigit()用来测试一个字符是否是一个数字.