在C中检测到堆栈粉碎

时间:2012-11-29 05:54:20

标签: c

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

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

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

但是,我的目标是为整个输入中的每个特殊字符执行此操作,即使有多个特殊字符(例如“asdf&amp; asdf&amp; asdf”)。所以我做了一个循环:

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

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

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

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

2 个答案:

答案 0 :(得分: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

等等。它会在第一个&周围插入越来越多的空格,并且循环永远不会结束,直到你在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始终引用尚未查找特殊字符的下一个位置。

答案 1 :(得分: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;