[英]Reverse words of a sentence using stack from c++ standard library
我正在尝试使用c ++标准库中的std::stack
反转每个句子的单词。
输入文件的内容为:
3
foobar的
这是一个测验
你所有的基地
所以答案应该是:
foobar的
测试一个是这个
尽你所能
但是,答案是:
foobar的
测试测试测试测试
基地基地基地基地
我不知道为什么。 以下是代码:
#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);
}
请不要这样混合C和C ++ 。 这几乎是不可读的。 一些准则:
std::string
从该行提取每个单词。 正如其他人在评论中所说,您的代码很糟糕 :
std::string
时,仅将char *
存储在其中 std::stringstream
在这里会有所帮助) fscanf
而不是fgets
(或者更好的getline
因为您的问题被标记为c ++) 但是,导致错误的真正原因仅仅是因为您在堆栈中存储了一个char *
,该char *
始终指向相同的char数组,而不是为每个单词分配新的数组。 所以:
并且您的堆栈包含n个字母地址的副本,每个副本都指向相同的最后一个单词数组。
您应该:
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.