删除存储在字符串中的数字的前导零

时间:2015-03-09 03:01:05

标签: c

struct number {char digits[11];};

以下方法从(* a).digits

中删除前导零
void remove_zero(struct number *a); 

示例:(* a).digits 000013204 ---> 13204

我的方法是定义变量b等于(* a).digits,开始搜索b中的第一个非零数字,然后将(* a).digits替换为b的其余部分。但是,我在实现代码时遇到了问题

void remove_zero(struct number *a) {
char b = (*a).digits;
while (b){   // <--- (b) indicates that it hasnt reached the terminator,right?
  if (b != '0')
    { //<-- here is where to replace (*a).digits with the rest of b, but how to?
break;
    }
  }
}

2 个答案:

答案 0 :(得分:5)

所以你有一个包含例如的数组。

+---+---+---+---+---+---+---+---+---+---+---+
| 0 | 0 | 0 | 0 | 1 | 3 | 2 | 0 | 4 | \0|   |
+---+---+---+---+---+---+---+---+---+---+---+

你希望它包含

+---+---+---+---+---+---+---+---+---+---+---+
| 1 | 3 | 2 | 0 | 4 | \0|   |   |   |   |   |
+---+---+---+---+---+---+---+---+---+---+---+

来自&#34;图像&#34;在上面,应该很清楚,这可以使用简单的movement数据来完成。

因此,一种解决方案是找到第一个非零字符,然后从该字符移动到数组的开头。

答案 1 :(得分:3)

一般而言,使用->运算符(例如,char b = (*a).digits; 运算符来推荐指向结构的指针并访问其属性更为清晰。而不是

char *b = a->digits;

这样做

digits

请注意b是一个字符数组,因此void remove_zero(struct number *a) { char *b = a->digits; char *end = a->digits + sizeof a->digits - 1; while (b < end && *b == '0') b++; if (b != a->digits) { size_t n = end - b; memmove(a->digits, b, n); a->digits[n] = '\0'; } } 需要是一个字符数组,或者是一个指向char的指针,如下所示。

所以:

{{1}}