【问题标题】:Wierd output for string operation IDEONE字符串操作IDEONE的奇怪输出
【发布时间】:2014-07-27 09:11:04
【问题描述】:

谁能告诉我为什么会这样,这里出了什么问题:

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

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

---> 当我使用 printf("%s\n",abc); http://ideone.com/Y6Sh5K

【问题讨论】:

  • 建议一:总是测试scanf()的返回值:if (scanf(WHATEVER, &amp;#1, ..., &amp;#n) != n) /* error */;
  • @n.m.但这段代码有printf("\n");
  • 我还没有阅读完整的代码,但你正在阅读 abc 之前的任何内容。这是未定义的行为。
  • if(&amp;abc[0] == &amp;abc[0]); 到底是为了什么

标签: c string output


【解决方案1】:

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

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

可能它似乎在 Dev-C++ 上工作,因为它不进行检查,并且每次都重复使用同一块内存。

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

【讨论】:

    【解决方案2】:

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

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

    将声明移出循环。

    【讨论】:

      猜你喜欢
      • 2021-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-27
      相关资源
      最近更新 更多