Tinex589 2023-03-28 19:39 采纳率: 0%
浏览 33

关于字符串入栈异常的问题

问题是这样的,我做一题构建二叉搜索树的题目(zoj1700),需要将输入的字符串入栈,但是总是空输出。经过了多次调试,发现是输入的字符串正常入栈失败了,但是栈也不为空,而且每次输出栈顶会输出相同乱码。
全代码(可以跳过):


#include<bits/stdc++.h>
using namespace std;
struct node
{
    char v;
    node *l,*r;
    node(char ch):v(ch),l(NULL),r(NULL){}
};
stack<string>dell;//删除的叶字符串序列入栈,顶端的将是深度更低的结点
void preorder(node *subtree)
{
    if(subtree==NULL)
        return;
    printf("%c",subtree->v);
    preorder(subtree->l);
    preorder(subtree->r);
}
void crtBST(node *&subtree,char c)
{
    if(subtree==NULL)
    {
        subtree=new node(c);
        return;
    }
    if(c<subtree->v)
        crtBST(subtree->l,c);
    else
        crtBST(subtree->r,c);
}
void remove(node *subtree)
{
    if(subtree==NULL)
        return;
    remove(subtree->l);
    remove(subtree->r);
    delete subtree;
}
int main()
{
    bool exit=0;
    while(!exit)
    {
        string input;
        node *root=NULL;
        while(scanf("%s",input.c_str()),input[0]!='*'&&input[0]!='$')//问题在这里
            dell.push(input);
        if(input[0]=='$')exit=1;
        while(!dell.empty())
        {
            string t=dell.top();
            dell.pop();
            for(int i=0;i<t.length();i++)
                crtBST(root,t[i]);
        }
        preorder(root);
        printf("\n");
        remove(root);
        root=NULL;
    }
    return 0;
}

问题出在这里

while(scanf("%s",input.c_str()),input[0]!='*'&&input[0]!='$')//问题在这里
            dell.push(input);

我单独开了个新源文件,写了如下代码

#include<iostream>
#include<stack>
#include<string>
using namespace std;
stack<string>s;
int main()
{
    string str = "abc";
    while (scanf("%s",str.c_str()), str[0] != '*')
    {
        s.push(str);
        printf("%s",str.c_str());
    }
    return 0;
}

发现字符串可以正常入栈然后输出,让我百思不得其解。
后来将那段代码改成

while(scanf("%s",input.c_str()),input[0]!='*'&&input[0]!='$')
    dell.push(input.c_str());

可以正常输出而且AC了题目,但是还是搞不清楚那两个一样的操作为什么会得到不一样结果,希望解答疑惑,万分感谢。

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-03-29 07:03
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 文章:C语言 输入一行字符,统计其中有多少个单词 和 有三个字符串(网上找的代码有瑕疵已解决),找出其中最大者的完整代码及分析过程 中也许有你想要的答案,请看下吧
    • 除此之外, 这篇博客: C语言项目-后宫选妃系统-第三天-终结中的 其实上面都是今天上午就做好的,但是一直有点烦恼,因为在解决问题的过程中发现如果要去修改的话要对之前的代码大动干戈在这个项目里还好我变量名用的统一,因此只是改了一下每个子函数的返回类型和添加了一个判断,可是自己感觉还是不满意,这个项目算上注释总共420行,不大也不小,但是逻辑还算简单,由此可见在进行中大型项目之前进行构思,伪代码实现多重要!!不要像我这样一头扑上来就写代码,也算是吃了教训了,继续加油!奥利给! 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
      /*
      后宫选妃系统
      六大模块:
          1.下旨选妃 -完成
              输入一名新妃子的名字,新增加一位新的妃子,然后其他妃子的宠爱度减 10 点
          2.翻牌宠幸-完成
              输入一名妃子的名字,翻牌宠幸其,增加其宠爱度10点,减少其他妃子宠爱度10点
          3.打入冷宫-完成
              输入一名妃子的名字,删除一位妃子,然后其他所有的妃子宠爱度加 10 点,若无此人则显示虚惊一场
          4.朕的爱妃呢-完成
              查找妃子,输入妃子的姓名并显示基本信息,被选中的妃子宠幸度加 10 点.其他妃子宠爱度减10点
          5.巡视后宫-完成
              巡视后宫,显示所有在宫妃子信息
          6.游戏规则判定-未
      妃子等级制(始皇制):
          一后
          三夫人
          九嫔
          二十七世妇
          八十一御女
      游戏规则:1.若有三名妃子宠爱度处于50以下则发生暴动,游戏结束
              2.若有人宠爱度达到100,镇压后宫,游戏结束
              3.每名妃子默认宠爱度70点
      */
      
      #include <stdio.h>
      #include <string.h>
      
      typedef struct concubine
      {
          char name[10];  //名字,最多十个字符
          int level;      //后宫等级
          int likability; //宠爱度
      } concu;
      
      //函数声明
      int addOne(concu *ptca, int *num);
      int chooseOne(concu *ptca, int *num);
      int forsakeOne(concu *ptca, int *num);
      int findOne(concu *ptca, int *num);
      void seeAll(concu *ptca, int *num);
      int judege_1(concu *ptca, int *num);
      int judege_2(concu *ptca, int *num);
      
      //   游戏规则判断计数器1   冷宫总人数
      int count = 0, leave = 0; //初始化总比不初始化好
      
      int main(void)
      {
          //存储conu的(X可变长)数组
          concu concus[31];
          int n = 0, *num = &n; //存储后宫妃子总数,使用指针方便更改!数字指针定义时需要&取地址
          concu *p;
      
          //后宫初始化,默认有三位妃子
          concu c1 = {"刘解忧", 1, 70};
          concu c2 = {"孙尚香", 1, 70};
          concu c3 = {"鱼幼薇", 1, 70};
          concus[0] = c1;
          concus[1] = c2;
          concus[2] = c3;
          *num = 3;
      
          //选妃系统界面控制
      
          int c, d; //控制,循环控制界面
          while (d)
          {
              p = concus; //初始化指针
              printf("-------后宫选妃系统-------\n\
                  四大模块:\n\
                      1.下旨选妃\n\
                      2.翻牌宠幸\n\
                      3.打入冷宫\n\
                      4.朕的爱妃呢\n\
                      5.后宫巡视\n\
                      6.退出选妃系统\n\
                  请输入序号选择功能:\n");
      
              scanf("%d", &c);
              switch (c)
              {
              case 1:
                  // printf("1\n");
                  addOne(p, num); //函数1
                  printf("输入任意键以继续.....\n");
                  scanf("%d", &c);
                  break;
              case 2:
                  // printf("2");
                  chooseOne(p, num); //函数2
                  printf("输入任意键以继续.....\n");
                  scanf("%d", &c);
                  break;
              case 3:
                  // printf("3");
                  forsakeOne(p, num); //函数3
                  printf("输入任意键以继续.....\n");
                  scanf("%d", &c);
                  break;
              case 4:
                  // printf("4");
                  findOne(p, num); //函数4
                  printf("输入任意键以继续.....\n");
                  scanf("%d", &c);
                  break;
              case 5:
                  // printf("5");
                  seeAll(p, num); //函数5
                  printf("输入任意键以继续.....\n");
                  scanf("%d", &c);
                  break;
              case 6:
                  printf("退出成功...\n");
                  c = 0;
                  break;
              default:
                  printf("小主,查无此功能啊!\n");
                  printf("输入任意键以继续.....\n");
                  scanf("%d", &c);
                  break;
              }
      
              d = judege_1(p, num) && judege_2(p, num);
              if (d == 0)
              {
                  printf("后宫暴动,游戏失败!");
                  printf("输入任意键以退出.....\n");
                  scanf("%d", &c);
              }
          }
      }
      
      //1.下旨选妃-输入一名新妃子的名字,新增加一位新的妃子,然后其他妃子的宠爱度减 10 点
      int addOne(concu *ptca, int *num)
      {
          //根据输入初始化一位妃子的信息
          char ch[10];
          int lev;
          printf("请输入妃子姓名,等级(1-5)(空号间隔):\n");
          scanf("%s %d", ch, &lev);
          concu c;
          strcpy(c.name, ch);
          c.level = lev;
          c.likability = 70;
          int n = *num; //临时数量控制器,操纵循环
          //使用遍历完成下旨选妃中的操作
          concu *p = ptca;
          for (int i = 0; i < n + 1; i++)
          {
              if (strcmp(p->name, ch) == 0)
              {
                  printf("皇上,%s已经在宫中了呢!\n", ch);
                  return 0;
              }
              p++;
          }
          for (int i = 0; i < n + 1; i++)
          {
      
              if (i < *num)
              {
                  ptca->likability -= 10;
                  ptca++;
              }
              else
              {
                  *ptca = c;
                  *num += 1; //总数加一
                  printf("恭喜选妃成功;妃子信息:姓名:%s,等级:%d,宠爱度:%d\n", ptca->name, ptca->level, ptca->likability);
                  // printf("当前后宫总人数:%d\n", *num);
              }
          }
      }
      
      //2.翻牌宠幸-输入一名妃子的名字,翻牌宠幸其,增加其宠爱度10点,减少其他妃子宠爱度10点
      int chooseOne(concu *ptca, int *num)
      {
          int n = *num; //临时变量,控制循环
          char a_name[10];
      
          //准备翻牌
          printf("皇上,可以翻牌了呢,输入想翻牌的妃子名字即可:\n");
          scanf("%s", a_name);
          // gets(name);
          // printf("1");
          // int i = 0;
          printf("当前即将被翻牌的妃子名称是 %s ...\n", a_name);
      
          //判断是否在宫中
          concu *p = ptca;
          int a_count = 0; //不同名妃子计数器
          for (int i = 0; i < n; i++)
          {
              // printf("%s --- %s\n", p->name, a_name);
              if (strcmp(p->name, a_name) != 0)
              {
                  a_count++;
              }
              // printf("%d\n", a_count);
              p++;
          }
          if (a_count == n)
          {
              printf(" %s 还不在宫中呢...\n", a_name);
              return 0;
          }
      
          printf("\n");
          for (int i = 0; i < n; i++)
          {
              if ((strcmp(a_name, (ptca->name)) == 0)) //判断名字是否相等,相等返回0
              {
                  ptca->likability += 10;
                  printf(" %s 翻牌成功!\n", ptca->name);
              }
              else
              {
                  ptca->likability -= 10;
                  printf("后宫徒生嫉妒, %s 宠爱度减少10点!\n", ptca->name);
              }
              ptca++; //指针指向下一个结构体
          }
      };
      
      //3.打入冷宫-输入一名妃子的名字,删除一位妃子,然后其他所有的妃子宠爱度加 10 点,若无此人则显示虚惊一场
      int forsakeOne(concu *ptca, int *num)
      {
          int n = *num; //临时变量,控制循环
          char a_name[10];
          concu c;
          strcpy(c.name, "0");
          c.level = 0;
          c.likability = 0;
      
          //准备翻牌
          printf("皇上,您要抛弃哪位妃子呢,输入妃子名字即可:\n");
          scanf("%s", a_name);
          // gets(name);
          // printf("1");
          int i = 0;
          printf("当前即将被即将被打入冷宫的妃子名称是 %s ...", a_name);
      
          //判断是否在宫中
          concu *p = ptca;
          int a_count = 0; //不同名妃子计数器
          for (int i = 0; i < n; i++)
          {
              // printf("%s --- %s\n", p->name, a_name);
              if (strcmp(p->name, a_name) != 0)
              {
                  a_count++;
              }
              // printf("%d\n", a_count);
              p++;
          }
          if (a_count == n)
          {
              printf(" %s 还不在宫中呢...\n", a_name);
              return 0;
          }
      
          printf("\n");
          for (int i = 0; i < n; i++)
          {
      
              if ((strcmp(a_name, (ptca->name)) == 0)) //判断名字是否相等,相等返回0
              {
                  *ptca = c;
              }
              else
              {
                  ptca->likability += 10;
                  printf("因 %s 被打入冷宫, %s宠爱度增加10点!\n", a_name, ptca->name);
              }
      
              ptca++; //指针指向下一个结构体
          }
      };
      
      //4.朕的爱妃呢-查找妃子,输入妃子的姓名并显示基本信息,被选中的妃子宠幸度加 10 点.其他妃子宠爱度减10点
      int findOne(concu *ptca, int *num)
      {
          int n = *num; //临时变量,控制循环
          char a_name[10];
          printf("皇上您要查找哪一位妃子呢,输入名字即可:\n");
          scanf("%s", a_name);
          printf("当前要查找的妃子是%s....\n", a_name);
      
         //判断是否在宫中
          concu *p = ptca;
          int a_count = 0; //不同名妃子计数器
          for (int i = 0; i < n; i++)
          {
              // printf("%s --- %s\n", p->name, a_name);
              if (strcmp(p->name, a_name) != 0)
              {
                  a_count++;
              }
              // printf("%d\n", a_count);
              p++;
          }
          if (a_count == n)
          {
              printf(" %s 还不在宫中呢...\n", a_name);
              return 0;
          }
      
          //在遍历中寻找符合要求的妃子并打印信息
          for (int i = 0; i < n; i++)
          {
      
              if ((strcmp(a_name, (ptca->name)) == 0))
              {
                  printf("姓名\t等级\t宠爱度\t\n");
                  printf("%s\t", ptca->name);
                  //打印等级,并用中文替代
                  switch (ptca->level)
                  {
                  case 1:
                      printf("御女\t");
                      break;
                  case 2:
                      printf("世妇\t");
                      break;
                  case 3:
                      printf("嫔\t");
                      break;
                  case 4:
                      printf("夫人\t");
                      break;
                  case 5:
                      printf("后\t");
                      break;
                  default:
                      printf("0\t");
                      break;
                  }
                  //打印宠爱度
                  printf("%d\n", ptca->likability);
              }
              ptca++;
          }
      };
      
      //5.巡视后宫,打印所有妃子信息,跳过被打入冷宫的妃子信息
      void seeAll(concu *ptca, int *num)
      {
          int n = *num; //临时变量控制循环
          printf("-----------------------------------------\n");
          printf("姓名\t等级\t宠爱度\t\n");
          for (int i = 0; i < n; i++)
          {
              if (ptca->level != 0)
              {
                  //打印姓名
                  printf("%s\t", ptca->name);
                  //打印等级,并用中文替代
                  switch (ptca->level)
                  {
                  case 1:
                      printf("御女\t");
                      break;
                  case 2:
                      printf("世妇\t");
                      break;
                  case 3:
                      printf("嫔\t");
                      break;
                  case 4:
                      printf("夫人\t");
                      break;
                  case 5:
                      printf("后\t");
                      break;
                  default:
                      printf("0");
                      break;
                  }
                  //打印宠爱度
                  printf("%d\n", ptca->likability);
              }
              ptca++;
          }
      };
      
      //6.1.若有三名妃子宠爱度处于50以下则发生暴动,游戏结束
      int judege_1(concu *ptca, int *num)
      {
          int n = *num; //临时变量,控制循环
          count = 0;    //计数器清0
      
          //循环  计数器
          for (int i = 0; i < n; i++)
          {
              if (ptca->likability < 50)
              {
                  count++;
              }
          }
      
          //判断
          if (count >= 3)
          {
              return 0;
          }
          else
          {
              return 1;
          }
      }
      
      //6.2.若有人宠爱度达到100,镇压后宫,游戏结束
      int judege_2(concu *ptca, int *num)
      {
          int n = *num; //临时变量,控制循环
      
          //循环  计数器
          for (int i = 0; i < n; i++)
          {
              if (ptca->likability >= 100)
              {
                  return 0;
              }
          }
          return 1;
      }
      
      

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 修改了问题 3月29日
  • 修改了问题 3月29日
  • 创建了问题 3月28日