在C ++中比较字符与字符串组件时出错

时间:2014-05-01 06:56:03

标签: c++ string file

#include <iostream>
#include <fstream>
#include <cstring>
#define MAX_CHARS_PER_LINE 512
#define MAX_TOKENS_PER_LINE 20
#define DELIMITER " "
using namespace std;
int main ()
{
    //char buf[MAX_CHARS_PER_LINE];
    string buf; // string to store a line in file
    fstream fin;
    ofstream fout;
    fin.open("PiCalculator.h", ios::in);
    fout.open("op1.txt", ios::out);
    fout<< "#include \"PiCalculator.h\"\n";
    static int flag=0; //this variable counts the no of curly brackets

    while (!fin.eof())
    {
        // read an entire line into memory
        getline(fin, buf);
        //fout<<buf.back()<<endl;
        if(buf.back()== "{" && buf.front() !='c'){
            flag++;
            fout<<buf<<endl;
        }
        if(flag > 0)
            fout<<buf<<endl;
        if(buf.back()== "}"){
            flag--;
            fout<<buf<<endl;
        }
    }
    cout<<buf.back()<<endl;
    return 0;
}

这里我收到if条件中的错误:

if(buf.back()== "{" && buf.front() !='c')

错误说明:ISO C ++禁止在指针和整数[-fpermissive]

之间进行比较

任何人都可以帮我解决问题吗?

4 个答案:

答案 0 :(得分:1)

由于您检查bug.back的“{”和bug.front的“c”,您的比较可能无效。我假设后面和前面函数返回的类型必须相同。一个是单引号,另一个是“{”是双引号。那就是问题。

将“{”更改为“{”

希望这有帮助。

答案 1 :(得分:1)

正如Samuel所说,std :: string :: back返回一个char&amp ;; (例如,请参阅http://en.cppreference.com/w/cpp/string/basic_string/back),然后将其与字符串文字进行比较(双引号表示字符串,单引号为char)。

在这种情况下,为什么没有必要拥有#include <string>指令并不清楚,但最佳做法是这样做。但是,您需要<cstring>并不明显。

我建议编写警告;如果我以这种方式编译你的代码,我得到相当有用的错误消息:

g++ -Wall -Wextra -std=c++11    q3.cc   -o q3
q3.cc: In function ‘int main()’:
q3.cc:24:25: warning: comparison with string literal results in unspecified behaviour [-Waddress]
         if(buf.back()== "{" && buf.front() !='c'){
                         ^
q3.cc:24:25: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]
q3.cc:30:25: warning: comparison with string literal results in unspecified behaviour [-Waddress]
         if(buf.back()== "}"){
                         ^
q3.cc:30:25: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]

这是gcc版本4.8.2。

答案 2 :(得分:0)

buf.back()返回char或char&amp;。

您要比较的是字符串文字“{”,它不起作用。

将此行更改为(以及与字符串文字比较的所有其他行:

 if(buf.back()== '{' && buf.front() !='c'){

注意'{'

答案 3 :(得分:0)

buf.back()== "{"

字符串文字"{"衰减成指针,buf.back()返回int,因此你得到错误

请将其更改为

buf.back() == '{'