使用c+中的堆栈反转句子中的单词+;标准库 我试图用C++代码库中的“ STD::Stuts”来反转每个句子的单词。p>
输入文件内容包括: 3使用c+中的堆栈反转句子中的单词+;标准库 我试图用C++代码库中的“ STD::Stuts”来反转每个句子的单词。p>,c++,stack,C++,Stack,输入文件内容包括: 3 foobar 这是一个测试 你所有的基地 因此,答案应该是: foobar 测试a:这是 以你的全部为基础 但答案是: foobar 测试 基础 我不明白为什么。代码如下: #include <cstdio> #include <cstdlib> #include <fstream> #include <cstring> #include <stack> using namespace std; int ma
foobar
这是一个测试
你所有的基地 因此,答案应该是: foobar
测试a:这是
以你的全部为基础 但答案是: 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);
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main(){
文件*fp,*fpo;
fp=fopen(“试验in”,“r”);
智力测验;
fscanf(fp、%d、&tests);
char ch;
fscanf(fp、%c、&ch);
对于(int i=0;i
请不要以这种方式将C和C++混合在一起。这几乎是不可读的。一些准则:
- 不要对字符串使用原始字符数组,请使用:
- 使用C++工具读取行:
- 使用前一个函数,您需要使用C++文件流。
- 一旦你读了一行,你就可以使用a和a
从该行中提取每个单词std::string
- 然后可以将堆栈上的每个单词按下,然后弹出以反转整个字符串
- 不要对字符串使用原始字符数组,请使用:
- 使用C++工具读取行:
- 使用前一个函数,您需要使用C++文件流。
- 一旦你读了一行,你就可以使用a和a
从该行中提取每个单词std::string
- 然后可以将堆栈上的每个单词按下,然后弹出以反转整个字符串
- 使用IO的C标准库,当你可以使用C++库(<代码> STD::StrugSuth)将帮助这里
- 您的输入是面向行的,并且您使用
而不是fscanf
(或者更好地使用fgets
,因为您的问题被标记为c++)getline
- 请不要以这种方式混合C和C++。这几乎是不可读的。一些准则:
-
<> LI>使用高级C++堆栈,但只在其中存储“代码> char */CODE >,当您可以使用<代码> STD::String
char*
,而不是为每个单词分配一个新数组。因此:
- 你在字母中找到一个单词
- 您只存储字母的地址,而不存储其内容
- 你用下一个单词来擦除字母
- 使用malloc或strdup为每个字分配一个新数组(C方式),并一致地释放每个分配的数组
TL/DR:如果您使用C++库(GETLIN、STD::String、IOFSUSTER、STRIGSTROW、StUPS),库本身将将您从该错误中解救出来。
如其他评论中所说,您的代码不好:
-
<> LI>使用高级C++堆栈,但只在其中存储“代码> char */CODE >,当您可以使用<代码> STD::String
- 使用IO的C标准库,当你可以使用C++库(<代码> STD::StrugSuth)将帮助这里
- 您的输入是面向行的,并且您使用
而不是fscanf
(或者更好地使用fgets
,因为您的问题被标记为c++)getline
char*
,而不是为每个单词分配一个新数组。因此:
- 你在字母中找到一个单词
- 您只存储字母的地址,而不存储其内容
- 你用下一个单词来擦除字母
- 使用malloc或strdup为每个字分配一个新数组(C方式),并一致地释放每个分配的数组
TL/DR:如果您使用了C++库(GETLIN,STD::String,IOFSUSTER,String String,Stand),库本身就可以将您从该错误中解救出来。
为什么不使用<代码> <代码>?您显然是一遍又一遍地调用同一个地址,为什么要用这种(讨厌的)方式混合C和C++?我以为你说你