0

私は解決策を設計したhttp://www.spoj.com/problems/SHLIGHTS/を実行しようとしています。私は C++ (約 14 日) に非常に慣れていないため、多くの問題に直面しています。以前はPythonを使用していましたが、これらのエラーは何もありませんでしたが、とにかく、これを書きました..

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

//example is GBGBBB
//t=0, GBGBBB then t=1,BGBGBB then t=2 BBGBGB, then t=3 BBBGBG
//search for GB and replace it with BG

//we need a function that replaces things
string swapSEQ(string SEQ)
{
    unsigned int sizeSEQ=SEQ.size();
    unsigned int curr(0);
    while (curr<sizeSEQ-1)
    {
        if (SEQ[curr]=="G" and SEQ[curr+1]=="B")
        {
            SEQ[curr]="B";SEQ[curr+1]="G";curr+=2;
        }
        else {++curr;}
    }
    return SEQ;
}

int main()
{
    unsigned int numCases;
    scanf("%d",&numCases);
//  cin>>numCases;
    for (unsigned int currentCase=0;currentCase<numCases;++currentCase)
    {
        string SEQ;
        //scanf("%s",&SEQ);
        cin>>SEQ;
        string swapped=swapSEQ(SEQ);
        unsigned long long t=0;
        while (swapped!=SEQ)
        {
            swapped=swapSEQ(SEQ);++t;       
        }
        printf("%lld\n",t);

    }
    return 0;
}

細かいことはわかっていますが、それだけです。SPOJ では、入力と出力の後に空白行が表示されますが、説明を読んだ後、1​​ 行で処理する必要があることがわかりました。これが私のg ++​​ 4.7コンパイラ(LINUX)で得られるものです

SHLIGHTS.cpp: In function ‘std::string swapSEQ(std::string)’:
SHLIGHTS.cpp:17:18: error: comparison with string literal results in unspecified behaviour [-Werror=address]
SHLIGHTS.cpp:17:18: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]
SHLIGHTS.cpp:17:37: error: comparison with string literal results in unspecified behaviour [-Werror=address]
SHLIGHTS.cpp:17:37: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]
SHLIGHTS.cpp:17:52: error: invalid conversion from ‘const char*’ to ‘char’ [-fpermissive]
SHLIGHTS.cpp:17:66: error: invalid conversion from ‘const char*’ to ‘char’ [-fpermissive]
cc1plus: all warnings being treated as errors

*何が起こっているのですか?ポインター、const char、および未指定の動作について何かがあります。
**ポインターは、メモリの場所を指す一種の変数であり、それ以上のものではないことは知っています。
**いくつかの場所でscanfを使用し、他の場所でcinを使用しました(scanfをcinに置き換えると、同じエラーが発生します)
**引数として受け取った文字列を返したという事実について何かありますか?
**どこでポインターを使用しましたか?
**これは間違っていますか? C++ の文字列は char 配列ですか? いいえの場合、無効な変換はどこにありますか?

事前に感謝し、何か間違ったことをお詫びします. 長すぎる場合は、疑問に答えてください。

4

2 に答える 2

1
  1. 文字列ではなく文字であるため、 notと比較SEQ[curr]する必要があります。'G'"G"
  2. &&の代わりに演算子を使用する必要がありandます。
  3. あなたの論理の何かが磨耗しています。文字列の 1 つのインデックスでは、1 文字しか持てません。したがって、書くことif (SEQ[curr] == 'G' && SEQ[curr] == 'B'は書くことと同じif (false)です。
  4. これはエラーではありませんが、1 行に複数のコメントを記述してコードを乱用しないでください。
  5. あなたが書いているのがC++cinである場合は、 ではなくを使用してくださいscanf
  6. 使ったことがないのに、なぜ作っているのsizeSEQですか?しないでください!
于 2013-07-19T10:32:04.523 に答える
0

'G'などの代わりに使用する必要があります"G"。char 配列 (例: arr[5]) にアクセスすると、 が得られます。これは、cstring (例:または) ではなくchar、char リテラル (: である) と比較できます。'G'"G""Google"

コンパイラはあなたの友人です。問題は次のとおりです。

文字列リテラルとの比較

于 2013-07-19T10:27:27.270 に答える