2
#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    int n;
    cin >> n;

    string a;
    cin >> a;

    int index;

    for(int i=0;i<strlen(a);i++)
    {
        if(a[i]=="?")
        {
            index=i;
        }
    }

    cout << index;

    return 0;
}

「?」を見つけたい。存在する場合は文字列に含まれていますが、エラーが発生します:「ISO C ++はポインターと整数の間の比較を禁止しています」

何か助けはありますか?

4

7 に答える 7

7

「?」を一重引用符で囲みます。文字列の代わりに char を示す文字。それがあなたの比較が失敗している理由です。

于 2013-02-26T00:19:04.223 に答える
5

A: for ループで C++ 文字列と古い C スタイル (strlen) 関数を混在させる (a.length()代わりに使用)

B: C の文字列を char と比較するif(a[i]=="?")(if(a[i]=='?')文字を比較するには一重引用符を使用します。二重引用符を使用すると、実際にはポインター比較である文字列比較になり、期待どおりに動作しません)

于 2013-02-26T00:19:47.557 に答える
4

他の答えに加えて、いくつかの便利な組み込み関数を使用して、プログラムを次のように減らすことができます。

#include <iostream>
#include <string>

int main()
{
    std::string a;
    std::getline(std::cin, a);

    int index;

    auto pos = a.find("?");

    if (pos != std::string::npos)
      index = pos;
   else
      index = -1;

    std::cout << index;
}

助言:

  • <string>の代わりに使用<cstring>
  • 入力と文字列を操作するときは、std::getline代わりにを使用std::cinして行全体を消費します。
  • std::string::find手動でループするよりも優れた代替手段です。
于 2013-02-26T00:29:37.833 に答える
2

助けはありますか?

  1. オブジェクト std::string のインスタンスで c 関数 strlen() を呼び出すことはできません代わりに std::string::length() を使用してください
  2. operator[] of std::string は、const char 型の文字列定数と比較しようとしている char 型を返します *
  3. 初期化されていない変数インデックスを使用し、条件が成功しなかった場合(最終的に修正すると仮定)、それを見つける方法はありません
  4. std::string には、文字列内の位置または定数 std::string::npos が見つからない場合に返す find() メソッドがあります。
于 2013-02-26T00:25:05.013 に答える
1

インラインコメント...

#include <iostream>
//#include <cstring> // You don't need this
#include <string> // You do need this

// using namespace std; // You don't need this

int main()
{
    // int n; // This is not used
    // cin >> n; // Nor is this

    std::string user_input; // Use std:: and meaningful variable names
    std::cin >> user_input; // "

    int index = user_input.find('?'); // This is the simplest way to find a character

    // for(int i=0;i<strlen(a);i++) // strlen() does not work here
    // {
    //  if(a[i]=="?") // chars are quoted with single quotes, as above. This is {'a', '\0'}
        //{
            // index=i; You could break here, too, otherwise you'll reurn the last '?'
        //}
    // }

    std::cout << index;

    // return 0; // This is unnecessary
}
于 2013-02-26T00:31:25.803 に答える
0

"?"メモリに文字列を作成します。のような定数文字列"?"は、メモリ内のアドレスの先頭を指します。したがって、それはポインターです。

'?'その場で単一の文字を作成し、ポインターは作成されません。したがって、別の文字または整数と比較する場合、整数 (または文字) をポインタ (文字列など) と比較しようとすると、ISO C++ は禁止します。

だからそうあるべきだ

    if(a[i]=='?')
    {
        index=i;
    }
于 2013-02-26T00:38:45.683 に答える
0

ここでは、std::string から 1 つの* 疑問符 ('?') を見つける方法を示します。コメントを必ず読んでください。

int main( void )
{
    // DECLARE LOCAL VARIABLES
    // Declare strA as std::string
    std::string strA = "";
    // Declare nIndex as int. We set the value of it to -1 to let us know
    // if there were any '?' within strA
    int nIndex = -1;

    // INITIALIZE
    // Set the value of strA to the line that was inputted
    // You might want to loop this until the length of strA
    // is greater than 0
    std::getline( std::cin, strA );

    // SEARCH FOR THE FIRST '?'
    // if std::string::find returns -1, then no '?' was found within strA
    nIndex = strA.find( '?' );

    // CHECKING AND PRINTING nIndex
    // Remember why strA is -1?
    if( nIndex == -1 )
        std::cout << "The inputted string does not contain any '?'...\n";
    else std::cout << "The first '?' is found at: " << nIndex;

    // DONE

#ifdef DEBUG
    std::cout << "\nDebugging > Paused! Enter any key to continue...\n";
    ::getchar( );
#endif // DEBUG
    return( 0 );
};
于 2013-02-26T01:05:41.063 に答える