Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用c+中的堆栈反转句子中的单词+;标准库 我试图用C++代码库中的“ STD::Stuts”来反转每个句子的单词。p>_C++_Stack - Fatal编程技术网

使用c+中的堆栈反转句子中的单词+;标准库 我试图用C++代码库中的“ STD::Stuts”来反转每个句子的单词。p>

使用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

输入文件内容包括:

3
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
请不要以这种方式将CC++混合在一起。这几乎是不可读的。一些准则:

  • 不要对字符串使用原始字符数组,请使用:
  • 使用C++工具读取行:
  • 使用前一个函数,您需要使用C++文件流。
  • 一旦你读了一行,你就可以使用a和a
    std::string
    从该行中提取每个单词
  • 然后可以将堆栈上的每个单词按下,然后弹出以反转整个字符串

    • 请不要以这种方式混合CC++。这几乎是不可读的。一些准则:

      • 不要对字符串使用原始字符数组,请使用:
      • 使用C++工具读取行:
      • 使用前一个函数,您需要使用C++文件流。
      • 一旦你读了一行,你就可以使用a和a
        std::string
        从该行中提取每个单词
      • 然后可以将堆栈上的每个单词按下,然后弹出以反转整个字符串

      正如其他人在评论中所说,您的代码不好:

        <> LI>使用高级C++堆栈,但只在其中存储“代码> char */CODE >,当您可以使用<代码> STD::String
      • 使用IO的C标准库,当你可以使用C++库(<代码> STD::StrugSuth)将帮助这里
      • 您的输入是面向行的,并且您使用
        fscanf
        而不是
        fgets
        (或者更好地使用
        getline
        ,因为您的问题被标记为c++)
      但导致错误的实际原因很简单,就是在堆栈中存储了一个始终指向同一个字符数组的
      char*
      ,而不是为每个单词分配一个新数组。因此:

      • 你在字母中找到一个单词
      • 您只存储字母的地址,而不存储其内容
      • 你用下一个单词来擦除字母
      堆栈包含n个字母地址副本,每个字母都指向最后一个单词的相同数组

      你应该:

      • 使用malloc或strdup为每个字分配一个新数组(C方式),并一致地释放每个分配的数组
      • 使用 > STD::String ,并更好地使用Actho>代码栈> /Cuff>(C++方式),让C++库管理分配和解除分配。
      在C++程序中使用C库函数有很好的理由(在已经使用C代码的程序中的大小或性能约束,分配),但是除非是这样,否则,高级C++库使用起来比低级别C一个错误风险小。

      TL/DR:如果您使用C++库(GETLIN、STD::String、IOFSUSTER、STRIGSTROW、StUPS),库本身将将您从该错误中解救出来。

      如其他评论中所说,您的代码不好:

        <> LI>使用高级C++堆栈,但只在其中存储“代码> char */CODE >,当您可以使用<代码> STD::String
      • 使用IO的C标准库,当你可以使用C++库(<代码> STD::StrugSuth)将帮助这里
      • 您的输入是面向行的,并且您使用
        fscanf
        而不是
        fgets
        (或者更好地使用
        getline
        ,因为您的问题被标记为c++)
      但导致错误的实际原因很简单,就是在堆栈中存储了一个始终指向同一个字符数组的
      char*
      ,而不是为每个单词分配一个新数组。因此:

      • 你在字母中找到一个单词
      • 您只存储字母的地址,而不存储其内容
      • 你用下一个单词来擦除字母
      堆栈包含n个字母地址副本,每个字母都指向最后一个单词的相同数组

      你应该:

      • 使用malloc或strdup为每个字分配一个新数组(C方式),并一致地释放每个分配的数组
      • 使用 > STD::String ,并更好地使用Actho>代码栈> /Cuff>(C++方式),让C++库管理分配和解除分配。
      在C++程序中使用C库函数有很好的理由(在已经使用C代码的程序中的大小或性能约束,分配),但是除非是这样,否则,高级C++库使用起来比低级别C一个错误风险小。

      TL/DR:如果您使用了C++库(GETLIN,STD::String,IOFSUSTER,String String,Stand),库本身就可以将您从该错误中解救出来。

      为什么不使用<代码> <代码>?您显然是一遍又一遍地调用同一个地址,为什么要用这种(讨厌的)方式混合C和C++?我以为你说你