std :: cout似乎打印出额外的" |"最初打电话时

时间:2016-10-02 01:08:40

标签: c++11

我正在处理我的部分代码,假设正确输出错误消息。

请参阅下面的截图,我正在使用bash

./ myProgram< input3a.in | diff -a -y output3a.out -

左手边是我想要的。

a Lua mailing list post

由于某种原因,额外的" |"在char数组之前打印' line'打印出来。我怀疑可能是char阵列' line'不是空终止。但它是由cin.getline()初始化的;应该null终止char数组。

在这里,我尝试打印''我的主程序中的数组,它离开了|在它之前签署。 enter image description here

我的问题是。为什么std :: cout会显示这种行为?

由于

EDIT,

以下是我的问题代码。谢谢你再看看。

#include "char_stack.h"
#include <iostream>


void printErrorLine(int errorSpot, int c_count, char line[]){
    //Print the first line of error message char by char, at the
    //same time replace char with \t or space
    for(int x = 0; x <= errorSpot; x++){
        std::cout << line[x];

        if(line[x] != '\t'){
            line[x] = ' ';  
        }
    }   
    std::cout << std::endl;
    //Print out the second line, if the first line does not have a 
    //errorSpot, then dont print it
    if(errorSpot != c_count){
        std::cout << line << std::endl;
    }
}


char findCounterPart(char bracket){
    //pass.
}

int main(int argc, char * argv[]){
    char line[250];     // 250 because spec sheet detailed max 250 char per line.
    char c;
    int l_count = 0;    // number of lines already read
    int c_count;        // character count in a line
    char_stack S;

    bool isError;

    while(!std::cin.peek() == std::cin.eof()){
        std::cin.getline(line, 250);
        c_count = std::cin.gcount();
        l_count +=1;
        //std::cout<< c_count << std::endl << std::endl;
        //loop through the line
        for(int x = 0; x < c_count; x++){
            c = line[x];
            //std::cout << c << " stack size is " << S.size() << std::endl;

            if (c == '(' || 
                c == '{' || 
                c == '['){
                S.push(c);  
            }

            else if(c == ')' ||
                    c == '}' ||
                    c == ']'){

                if(S.empty()){
                    std::cout << "Error on line " << l_count << ": Too many " << c << std::endl;
                    isError = true;
                }
                else{
                    char l = S.pop();
                    if(l != findCounterPart(c)){
                        std::cout << "Error on line " << l_count << ": Read " << c <<
                        ", expected " << findCounterPart(l) << std::endl;
                        isError = true;
                    }
                }
            }   

            if (isError){
                printErrorLine(x, c_count ,line);
                return 0;
            }

        }
    }

    if (!S.empty()){
        c = S.pop();
        std::cout << "Error on line " << l_count << ": Too many " << c << std::endl;
        printErrorLine(c_count, c_count , line);
    }
    else{
        std::cout <<"No Errors Found" << std::endl;     
    }
    return 0;
}

1 个答案:

答案 0 :(得分:0)

学习成为一名软件工程师就是将问题分解成易于管理的块,这里我们有几个做法。让我们稍微改一下你的问题:

  

diff我的程序输出对包含上一次运行输出的文件时,显示意外字符。目前我认为这是因为std :: cout的一些奇怪的行为。

嗯,这可能是一个合理的假设,我们无法看到你的代码所以我们无法知道你是否在做任何特殊的事情。

但它必须是:std :: cout被使用,好吧,到处都是。它只是没有这种行为,除非你的代码故意在某处写|

我们可以采取一系列措施来解决这个问题:

  1. 在调试器中第3次运行程序并逐步执行,直到您有一些想法为'|'正在出现,
  2. 第三次运行程序到控制台并观察输出
  3. 使用catlessmore等命令查看输出,而不是diff
  4. 3也许是最明智的开始,因为文件已经就在那里,之后#2会给我们一个mk1eyeball检查。

    我们发现:|未出现在文件或输出中。它不是来自你的程序。

    让我们创建几个.txt文件并区分它们:

    osmith@WOTSIT MINGW64 ~
    $     echo -e 'First line\nSecond line' >test1.txt
    osmith@WOTSIT MINGW64 ~
    $     echo -e 'First line\nFile two line 2' >test2.txt
    osmith@WOTSIT MINGW64 ~
    $     diff -a -y test1.txt test2.txt
    First line                                                      First line
    Second line                                                   | File two line 2
    

    使用-y开关时,在两列输出之间,diff有一行特殊字符,表示已更改,插入或删除的行。