我一直在尝试使用一些带有字符的索引和一些具有空字符的字符数组,并将其更改为只有带字符的数组 - 转换索引以在需要时删除空格。
到目前为止,这是我的方法:
char *args[256];
void removeNulls(){
for(int i=0; i<=token; i++){
if(args[i] == '\0'){
shiftleft(i);
}
}
}
void shiftleft(int start){
for(int i=start; i<token; i++){
*(args+i) = *(args + i +1);
}
}
然而,当我这样做并打印出结果时,我注意到在args数组中, 这是最初的args数组,它包括:null,null,1,2,3,4在删除空数后,此数组变为空,1,2,3,4而不是所需的1,2,3,4。在我的循环条件中有什么东西可以解释这个吗?
答案 0 :(得分:4)
每次遇到空值时都会跳过一个索引,因为即使跳过也总是递增i
。只有在不跳过时才应增加i
,例如:
for (int i=0; i<=token; ) {
if (args[i] == '\0') {
shiftleft(i);
} else {
i++;
}
}
顺便说一下,当存在多个空值时,算法不是最优的,因为对于每个空值,您都会移动整个剩余部分。通过跟踪当前索引和下一个要填充的索引,可以在一次传递中将内容移到空值上。对于每个空值,下一个填充索引将比当前索引落后一步。
for (int i=0, next = 0; i<=token; i++) {
if (args[i] != '\0') {
args[next++] = args[i];
}
}
最后一件事,多余的元素怎么样?也就是说,对于输入null,null,1,2,3,token,结果内容将是1,2,3,2,3,token。这样那样好吗?我建议检查你的要求,因为你可能有一些关于这些剩余元素的任务。我把它留给你锻炼。
答案 1 :(得分:0)
当i = 0时,调用shiftleft(0)时,
无论地址指向的是什么(args + i) - &gt;(args + 0) - &gt;“null”被替换为(args + i + 1) - &gt;(args + 0 + 1) - &GT; “空”
这就是输出打印为空,1,2,3,4。
的原因将您的输入更改为空,1,2,3,4,您将看到差异。输出将为1,2,3,4