无效的转换,未指定的行为和char数组?

时间:2013-07-19 10:25:35

标签: c++

我正在尝试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在输入和输出后显示空白行,但在阅读说明后,我理解我们必须单行做事。这是我用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(如果我用cin替换scanf,我会得到相同的错误)
**是否有关于我返回一个字符串作为参数的事实? **我在哪里使用指针?
**我错了 - c ++中的字符串是char数组吗?如果不是,那么无效转换在哪里?

提前致谢,并对任何错误道歉。如果时间太长,请回答任何疑问。

2 个答案:

答案 0 :(得分:1)

  1. 您需要将SEQ[curr]'G'进行比较而不是"G",因为它是字符而不是字符串。
  2. 您应该使用运算符&&代替and
  3. 你的逻辑有些东西。在一个字符串的索引处,您只能拥有1个字符。因此,撰写if (SEQ[curr] == 'G' && SEQ[curr] == 'B'与撰写if (false)
  4. 相同
  5. 这不是错误,但请不要在一行中写下多个推荐信来滥用您的代码。
  6. 如果你写的是 C ++ ,请使用cin,而不是scanf
  7. 如果您从未使用过它,为什么要创建sizeSEQ?唐&#39;!吨

答案 1 :(得分:0)

您应该使用'G'代替"G",依此类推。当您访问char数组(例如arr[5])时,您将获得char,您可以将其与c​​har字面(为'G')进行比较,而不是与cstring进行比较(例如{{1} }或"G")。

编译器是你的朋友,它指出问题是:

  

与字符串文字比较