[英]Problem with comparison between pointer and integer C++
我收到錯誤消息說
[錯誤] ISO C ++禁止比較指針和整數[-fpermissive]
而且不知道如何解決。
我已經在stackoverflow上搜索了同樣問題的人,但只想到了這一點: c ++編譯錯誤:ISO C ++禁止比較指針和整數 ,這沒有回答我的問題。 也讓我感到困惑的是,錯誤出現在這里的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
,但沒有任何輸出。
表達式" "
是類型為const char [2]
的字符串文字 。
表達式s.at(i)
返回char&
。
因此, s.at(i) == " "
試圖找到在左邊使用char&
並在右邊引用文字數組const char(&)[4]
的相等運算符。
它為operator==
找到一個或多個候選,但是參數類型不完全匹配,因此接下來嘗試隱式轉換序列 -這是char&
進行整數提升為int
,而數組衰減為const char*
。
它仍然找不到與之匹配的對象,並放棄了,但這解釋了為什么在發出錯誤時它具有int
和const char *
參數。
這么說很長,您在C ++中編寫了像' '
這樣' '
字符文字。 它們不僅像其他一些語言一樣是長度為1的字符串(而且您根本無法編寫帶有單引號的字符串)。
更改if語句
if (s.at(i) == ' ') {
count += 1;
}
因為s.at(i)
返回char&,所以" "
是字符串,而' '
是字符。
問題是" "
是字符串文字而不是字符! 字符文字為' '
。
該錯誤有點令人誤解,因為" "
實際上是const char*
。
C ++通過不同的引號( "
vs '
)區分字符串中的字符串和單個字符 。代碼中的" "
是包含一個空格的字符串文字,單個空格字符將被寫為' '
std::string::at
函數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;
}
參見上面代碼的在線演示 。
但是,確切地說,C ++中的比較不需要相同的類型,但是類型必須兼容 。 指針(字符串文字被認為是指向字符的常量指針,實際上指向文字中的第一個字符)與整數(在您的情況下, char
被提升為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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.