簡體   English   中英

指針和整數C ++之間的比較問題

[英]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*

它仍然找不到與之匹配的對象,並放棄了,但這解釋了為什么在發出錯誤時它具有intconst 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM