指针与整数C++的比较问题

指针与整数C++的比较问题,c++,arrays,string,pointers,type-conversion,C++,Arrays,String,Pointers,Type Conversion,我一直收到错误消息说 (错误):ISO C++禁止指针和整数之间的比较[-fPrime] 我不知道如何修复它 我在stackoverflow搜索过有相同问题的人,但只找到了这个:它没有回答我的问题。同样让我困惑的是,错误在HERE注释指示的行上,这是if语句,但我在条件部分没有看到任何整数 #include<iostream> #include<cstdio> #include<cstring> #include<string> using na

我一直收到错误消息说

(错误):ISO C++禁止指针和整数之间的比较[-fPrime]

我不知道如何修复它

我在stackoverflow搜索过有相同问题的人,但只找到了这个:它没有回答我的问题。同样让我困惑的是,错误在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,但我没有得到任何输出。

更改if语句

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

因为s.ati返回char&,是一个字符串,“”是一个字符。

更改if语句

if (s.at(i) == ' ') {
    count += 1;
}
由于s.ati返回char&,是一个字符串,“”是一个字符。

问题在于它是一个字符串文本而不是一个字符!字符文字应为“”

这个错误有点误导,因为它实际上是一个常量字符*

问题在于它是一个字符串文字而不是一个字符!字符文字应为“”

这个错误有点误导,因为它实际上是一个const char*

表达式是一个具有const char[2]类型的表达式

表达式返回一个char&

因此,s.ati==试图找到一个等式运算符 char&位于左侧,对文本数组const char&[4]的引用位于右侧

它会找到运算符==的一个或多个候选对象,但参数类型与任何类型都不完全匹配,因此接下来它会尝试-这是char&变为int的地方,数组将变为const char*

它仍然找不到与这些匹配的参数,并放弃了,但这解释了为什么在发出错误时它有int和const char*参数

所有这些都是说你在C++中写字符字'`'是一个很长的方式。它们不象在其他一些语言中那样只是长度为1的字符串,而且您根本不能用单引号来写字符串。

表达式是一个带有常量字符[2]的类型

表达式返回一个char&

因此,s.ati==试图找到一个等式运算符 char&位于左侧,对文本数组const char&[4]的引用位于右侧

它会找到运算符==的一个或多个候选对象,但参数类型与任何类型都不完全匹配,因此接下来它会尝试-这是char&变为int的地方,数组将变为const char*

它仍然找不到与这些匹配的参数,并放弃了,但这解释了为什么在发出错误时它有int和const char*参数

所有这些都是说你在C++中写字符字'`'是一个很长的方式。它们不象在其他一些语言中那样只是长度为1的字符串,你根本不能用单引号来写字符串。

C++通过不同的引号符号来区分字符串和文本中的单字符。代码中的字符串是包含一个空格的字符串文字,单个空格字符将写为“”。该函数返回单个字符

一个小示例将向您展示编译器在这方面的外观

#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;
}
C++通过不同的引用符号vs'区分文本中的字符串和单个字符。代码中的字符串是包含一个空格的字符串文字,单个空格字符将写为“”。该函数返回单个字符

一个小示例将向您展示编译器在这方面的外观

#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;
}

永远不要使用它!它是从C和C++中移除的函数。如果您想从标准输入中读取一行,请使用读入a。至于您的问题,我建议您后退几步,然后回到您的书中,教程或课堂笔记,考虑由双引号分隔的字符串和由单引号分隔的字符之间的差异。我理解你迷惑不解——直到你非常熟悉C++中的隐式类型转换时,这条消息毫无意义。std::getline如果输入的行数超过一行,请给出一个\n?永远不要使用gets!它是从C和C++中移除的函数。如果您想从标准输入中读取一行,请使用读入a。至于您的问题,我建议您后退几步,然后回到您的书中,教程或课堂笔记,考虑由双引号分隔的字符串和由单引号分隔的字符之间的差异。我理解你迷惑不解——直到你非常熟悉C++中的隐式类型转换时,这条消息毫无意义。std::getline如果输入的行数超过一行,请给出一个\n答案?这个答案在技术上是正确的,但如果您能够准确地解释为什么按上述方式更改循环可以解决问题,以及根本问题是什么,那么这个答案将得到改进。这个答案虽然在技术上是正确的,但将得到改进
d如果你能确切地解释一下为什么按照描述改变循环可以解决这个问题,以及根本的问题是什么:我不仅太迟了,而且还忘记了促销的事情。有趣的是,错误消息对于初学者来说总是太少,而对于有经验的程序员来说则太多。很好的解释!是的,我试了几次才把它写对。我觉得编译器应该真正描述重载解析序列,而不是在最后显示提升的类型。我不仅太晚了,而且还忘记了提升的事情。有趣的是,错误消息对于初学者来说总是太少,而对于有经验的程序员来说则太多。很好的解释!是的,我试了几次才把它写对。我觉得编译器应该真正描述重载解析序列,而不是在最后显示提升的类型。实际上是一个常量字符*。。。这是一个指针,而涉及的字符。C++错误消息对初学者来说总是令人困惑的。实际上是一个常量字符*。。。这是一个指针,而涉及的字符。C++错误消息对初学者来说总是令人困惑的。