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