字符串操作IDEONE的奇怪输出

时间:2014-07-27 09:11:04

标签: c string output

有人能告诉我为什么会这样,这里有什么问题:

我必须打印一部分字符串,其中输入中给出了要打印的字符串的起始位置和长度。

问题: 当我在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

2 个答案:

答案 0 :(得分:0)

c == '?'块中的代码在未初始化时使用数组abc

似乎您认为abc块中放入c == '+'的数据应该在您进入下一个循环迭代时保留。但事实并非如此:abc是由while(q--) {打开的块的本地,因此每次循环迭代都会被销毁并重新创建。

可能它似乎适用于Dev-C ++,因为它不会检查,并且每次都重新使用相同的内存。

我想你想在循环开始时将部分或全部变量声明移动到循环之前。

答案 1 :(得分:0)

您在abc循环中声明了while(q--)

这意味着循环的每次迭代都有自己的未初始化的abc新副本,与前一次迭代无关。在初始化之前访问abc的任何位置是未定义的行为。这就是if(c == '?')分支的作用。

将声明移出循环。