有人能告诉我为什么会这样,这里有什么问题:
我必须打印一部分字符串,其中输入中给出了要打印的字符串的起始位置和长度。
问题: 当我在devC ++中运行它时,一切运行正常,输出正常。 当我在IDEONE中运行它时,代码不会产生[来自字符数组]的输出,除非我使用printf打印整个字符串(“%s \ n”,abc);
--->当我不使用printf(“%s \ n”,abc); http://ideone.com/BMjCku
#include<stdio.h>
#include<ctype.h>
int main()
{
long long int q;
int length=0;
scanf("%lld",&q);
while(q--)
{
int loc,cutlength=0,k=0,pos,plen=0;
char abc[100001],save[100001],c;
while(1)
{
scanf("%c",&c);
if(c=='+' || c=='?')
break;
}
if (c=='+')
{
scanf("%d",&loc); pos=loc;
cutlength=length-loc;
for(int i=loc;i<=length-loc;i++)
save[k++]=abc[i];
scanf("%c",&c);
while(!isalpha(c))
scanf("%c",&c);
while(1)
{
if(!isalpha(c))
break;
abc[loc++]=c; length++;
scanf("%c",&c);
}
length+=pos+cutlength;
for(int i=0;i<k;i++)
abc[loc++]=save[i];
}
else if(c == '?')
{
if(&abc[0] == &abc[0]);
scanf("%d%d",&loc,&plen);
loc--;
while(plen--)
printf("%c",abc[loc++]);
printf("\n");
//printf("%s\n",abc);
}
}
return 0;
}
---&GT;当我使用printf(“%s \ n”,abc); http://ideone.com/Y6Sh5K
答案 0 :(得分:0)
c == '?'
块中的代码在未初始化时使用数组abc
。
似乎您认为abc
块中放入c == '+'
的数据应该在您进入下一个循环迭代时保留。但事实并非如此:abc
是由while(q--) {
打开的块的本地,因此每次循环迭代都会被销毁并重新创建。
可能它似乎适用于Dev-C ++,因为它不会检查,并且每次都重新使用相同的内存。
我想你想在循环开始时将部分或全部变量声明移动到循环之前。
答案 1 :(得分:0)
您在abc
循环中声明了while(q--)
。
这意味着循环的每次迭代都有自己的未初始化的abc
新副本,与前一次迭代无关。在初始化之前访问abc
的任何位置是未定义的行为。这就是if(c == '?')
分支的作用。
将声明移出循环。