繁体   English   中英

使用C ++标准库中的堆栈反转句子的单词

[英]Reverse words of a sentence using stack from c++ standard library

我正在尝试使用c ++标准库中的std::stack反转每个句子的单词。

输入文件的内容为:

3
foob​​ar的
这是一个测验
你所有的基地

所以答案应该是:

foob​​ar的
测试一个是这个
尽你所能

但是,答案是:

foob​​ar的
测试测试测试测试
基地基地基地基地

我不知道为什么。 以下是代码:

#include <cstdio>
#include <cstdlib>
#include <fstream>
#include <cstring>
#include <stack>

using namespace std;

int main() {
  FILE *fp, *fpo;
  fp = fopen("test.in", "r");
  int tests;
  fscanf(fp, "%d", &tests);
  char ch;
  fscanf(fp, "%c", &ch); 
  for (int i = 0; i < tests; i++) {
    char *letters;
    letters = (char*)calloc(1000, sizeof(char));
    stack <char*> words;
    fscanf(fp, "%s", letters); fscanf(fp, "%c", &ch);

    while (ch != '\n' && ch != EOF) {
      words.push(letters); printf(" %s", words.top());
      fscanf(fp, "%s", letters); fscanf(fp, "%c", &ch);
    }
    words.push(letters); printf(" %s", words.top());
    printf("  --  ");
    while (!words.empty()) {
      printf(" %s", words.top());
      words.pop();
    }
    printf("\n");
    free(letters);
  }
  fclose(fp);  
}

请不要这样混合CC ++ 这几乎是不可读的。 一些准则:

  • 不要对字符串使用原始字符数组,请使用: std :: string
  • 使用C ++工具读取行: std :: getline
  • 要使用先前的功能,您将需要使用C ++文件流std :: ifstream
  • 读取一行后,可以使用std :: stringstreamstd::string从该行提取每个单词。
  • 然后,您可以将每个单词压入堆栈,然后弹出以反转整个字符串。

正如其他人在评论中所说,您的代码很糟糕

  • 您使用了高级c ++堆栈,但是当您可以使用std::string时,仅将char *存储在其中
  • 当可以使用C ++库时,可以使用C标准库进行IO( std::stringstream在这里会有所帮助)
  • 您输入的内容是面向行的,并且使用fscanf而不是fgets (或者更好的getline因为您的问题被标记为c ++)

但是,导致错误的真正原因仅仅是因为您在堆栈中存储了一个char * ,该char *始终指向相同的char数组,而不是为每个单词分配新的数组。 所以:

  • 你在字母中找到一个词
  • 您只存储字母的地址而不存储其内容
  • 你用下一个单词删除字母

并且您的堆栈包含n个字母地址的副本,每个副本都指向相同的最后一个单词数组。

您应该:

  • 使用malloc或strdup为每个单词分配一个新数组(C方式)-并始终释放每个分配的数组
  • 使用std::string ,最好使用stack<string> (C ++方式),让C ++库为您管理分配和释放。

有充分的理由在C ++程序中使用C库函数(已经使用C代码的程序的大小或性能限制,要进行分配),但是除非是这种情况,高级C ++库更易于使用与低级别C相比,错误风险更低。

TL / DR:如果您使用过C ++库(getline,std :: string,iostream,stringstream,stack),库本身将使您免于该错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM