0

我有一个循环运行以在一些特殊字符(&、|、<、>)之间添加空格。以下代码成功在特殊字符前后添加空格:

    char keys[] = "<>&|";
    int i = strcspn (input,keys); 
    appenda(input, " " , i);
    appenda(input, " " , i+2);

上面的代码将输入“asdf&asdf”转换为“asdf & asdf”。

但是,我的目标是对整个输入中的每个特殊字符都这样做,即使有多个特殊字符(如“asdf&asdf&asdf”)。所以我做了一个while循环:

    char keys[] = "<>&|";
    int i = strcspn (input,keys);
    while(i < strlen(input)){
        appenda(input, " " , i);
        appenda(input, " " , i+2);
        i = strcspn (input,keys);
    }

然而,当我现在运行我的代码时,它返回“ * **检测到堆栈粉碎* **

关于这意味着什么以及如何解决它的任何想法?

EDIT Appenda 在指定点将一个字符串插入另一个字符串。它接受 3 个参数:第一个是我插入的字符串,第二个是我要插入的字符串,第三个是索引。所以 appenda(ABCD, X, 2) 返回 AXBCD

4

2 回答 2

4

你总是在调用strcspn相同的input,并且你从来没有真正删除它找到的字符,所以它总是找到同一个。

例如,如果您的字符串是

asdf&asdf&asdf

第一次调用

int i = strcspn (input,keys)

i = 3由于在位置 4 处返回。&然后插入空格,效果很好,字符串变为:

asdf & asdf&asdf

现在你再次打电话

i = strcspn (input,keys)

这会返回i = 4,因为现在它&在位置 5 中找到了第一个。因此,当您再次插入空格时,字符串变为:

asdf  &  asdf&asdf

等等。它不断在 first 周围插入越来越多的空格&,并且循环永远不会结束,直到您超出内部缓冲区appenda并且您的程序死亡。

相反,一旦你插入了空格,你需要告诉你在找到一个特殊字符的地方strcspn开始寻找下一个特殊字符。这应该有效:

char keys[] = "<>&|";
int i = strcspn (input,keys);
while(i < strlen(input)){
    appenda(input, " " , i);
    i += 2;
    appenda(input, " " , i);
    i += strcspn (input + i,keys);
}

这会“移动” 的值,i以便在您调用 时strcspn(input + i, keys),该值input + i始终指向尚未查看特殊字符的下一个位置。

于 2012-11-29T06:13:36.880 回答
2

Tyler McHenry 是完全正确的。虽然我建议逐个字符循环并将其复制到一个新数组中,因为这样可以避免连续移动所有字符的需要。像这样:

int len = 200;
char input[len+1];
char output[len*3+1];
int outPos = 0;
for (int i = 0; i < len; i++)
{
  if (input[i] == 0) break; // end of string
  if (input[i] == '<' || input[i] == '>' || input[i] == '&' || input[i] == '|')
  {
    output[outPos++] = ' ';
    output[outPos++] = input[i];
    output[outPos++] = ' ';
  }
  else
    output[outPos++] = input[i];
}
output[outPos] = 0;
于 2012-11-29T06:43:51.837 回答