我的代码
int i,v,o,p,j;
v=0;
o=0;
char x[12]={'#','v','v','o','#','o','v','#','v','o','o','#'};
void vukovi (char a[])
{
for (i=0;i<12;i++){
if (x[i]=='#'){
for (j=i+1;x[j]!='#';j++){
if (x[j]=='v'){
v=v+1;
}
if (x[j]=='o')
o=o+1;
}
if (v>=o){
for (j=i+1;x[j]!='#';j++){
if (x[j]=='o'){
x[j]='.';
}
}
}
}
v=0;
o=0;
}
for (i=0;i<12;i++){
printf("%c",x[i]);
}
}
vukovi(x);
return 0;}
有时打印效果很好 有时错误
.exe停止工作
我不知道为什么。
计划的理念是:两个#
之间的任何地方v
&gt; o
,o
必须替换为.
就像我在打印时说的那样,打印效果很好
否则错误。帮忙?
(我遗漏了包含和主要功能)。
答案 0 :(得分:5)
当i==11
此循环错误时:
for (j=i+1;x[j]!='#';j++){
因为它使得j
从12开始。你已经在字符串之外了,但是因为你的循环在#
上停止了,所以在树林中向前推进:未定义的行为。
如果在通过未分配的内存(可能发生或不发生)时遇到#
字符,或者遇到超出系统检测到非法读取的页面边界而停止使用SEGV时,它会停止。
答案 1 :(得分:0)
你所面对的是Segmentation Fault 您正在访问您不应该访问的内存。
您的本部分代码:
for (i=0;i<12;i++){ //Till i<12, that means when i = 11 loop will run.
if (x[i]=='#'){
for (j=i+1;x[j]!='#';j++){ //j = i+1, for i = 11, j = 12
if (x[j]=='v'){
v=v+1;
}
if (x[j]=='o')
o=o+1;
}
if (v>=o){
for (j=i+1;x[j]!='#';j++){ //j = i+1, for i = 11, j = 12
if (x[j]=='o'){ //x[j] , for j = 12 , x[12]
x[j]='.'; //x[12] = '.' You Are Accessing Memory You Are Not Supposed to.
}
}
}
你不应该访问数组,它有很多风险 请参阅此问题How dangerous is it to access an array out of bounds?,我强烈推荐。