指针与整数C ++

时间:2019-04-05 10:11:34

标签: c++ arrays string pointers type-conversion

我一直收到错误消息,说

  

[错误] ISO C ++禁止比较指针和整数[-fpermissive]

而且不知道如何解决。

我已经搜索了stackoverflow中存在相同问题的人员,但是只想到了这个问题:c++ compile error: ISO C++ forbids comparison between pointer and integer,但并没有回答我的问题。同样让我感到困惑的是,错误出现在HERE注释所指示的在线上,这是if语句,但是在条件部分我看不到任何整数。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;

int main() {
    char in[100];
    gets(in);
    int len = strlen(in);
    std::string s(in);
    int count = 0;
    for (int i = 0; i < len; i++) {
        if (s.at(i) == " ") {        // <-- HERE
            count += 1;
        }
    }

    cout << count;
}

假设输入为Hello World,我希望输出为1,但没有得到任何输出。

4 个答案:

答案 0 :(得分:4)

表达式" "是类型为const char [2]的{​​{3}}。

表达式string literal返回一个char&

因此,s.at(i) == " "试图找到一个等式运算符 左侧是char&,右侧是对文字数组const char(&)[4]的引用。

它为operator==找到一个或多个候选,但是参数类型不完全匹配,因此接下来尝试s.at(i)-这是char&经历{{ 3}}到int,然后数组衰减到const char*

它仍然找不到与之匹配的内容,因此放弃了,但这解释了为什么在发出错误时它具有intconst char *参数。

这是说用C ++编写像' '这样的字符文字的很长的路要走。它们不仅仅是像其他一些语言中那样长度为1的字符串(而且您根本无法编写带有单引号的字符串)。

答案 1 :(得分:2)

更改if语句

if (s.at(i) == ' ') {
    count += 1;
}

因为s.at(i)返回char&," "是字符串,而' '是字符。

答案 2 :(得分:0)

问题在于" "是字符串文字而不是字符!字符文字为' '

该错误有点令人误解,因为" "实际上是const char*

答案 3 :(得分:0)

C ++ 通过不同的引号("')区分文字中的字符串和单个字符。您代码中的" "是字符串文字,其中包含一个空格,单个空格字符将写为' '。函数std::string::at返回单个字符。

一个小例子将向您展示编译器对此的外观

#include <iostream>
#include <string>
#include <typeinfo> // for typeid
using namespace std;

int main() {
    string s = "Hello, world!";
    cout << typeid(" ").name() << endl;
    cout << typeid(' ').name() << endl;
    cout << typeid(s.at(0)).name() << endl;
    return 0;
}

请参阅online demo of above code

但是,确切地说,C ++中的比较不需要相同的类型,但是这些类型必须是 compatible 。指针(字符串文字被认为是指向字符的常量指针,实际上指向文字中的第一个字符)与整数(在您的情况下,char被提升为整数)不兼容。要快速“解决”您的问题,请将s.at(i) == " "更改为s.at(i) == ' ',但是您的程序仍然会出现问题:它仍然包含很多本身也有问题的C代码。可能的C ++版本可能是这样:

#include <iostream>
#include <string>
using namespace std;

int main() {
    int count = 0;
    string line;
    std::getline(cin, line);
    for (const auto c: line) {
        if (c == ' ') {
            count++;
        }
    }
    cout << "Your input \""<< line << "\" contains " << count << " space(s)." << endl;
    return 0;
}