使用带有字符串字符串的基于范围的循环

时间:2013-08-02 15:18:42

标签: c++ pointers c++11

我是C ++ 11的新手,坦率地说,我在一年多的时间里没有使用过C ++,所以开始时我有点生疏。我正在从我的旧大学文本中做一些练习,并且在尝试迭代char指针字符串时遇到了问题(例如:char * c =“a string”;)。我无法在Google上找到任何有用的信息。我已经习惯了Java,其中foreach循环可以迭代任何集合。我知道指针是如何工作的,但是我从C ++中度过的长假让我对实际使用它们的语法一无所知。有人能告诉我为什么下面的代码(特别是convert()函数)在编译中导致错误,其中“开始”和“结束”未在此范围内声明?

Ex12_01_RomanType.h

#ifndef EX12_01_ROMANTYPE_H
#define EX12_01_ROMANTYPE_H

class RomanType {
  public:
    RomanType();
    RomanType(char * n);
    virtual ~RomanType();

    char * toString();
    int getValue();
  private:
    char * numeral;
    int decimal;

    void convert();
};

#endif // EX12_01_ROMANTYPE_H

Ex12_01_RomanType.cpp

#include "Ex12_01_RomanType.h"

RomanType::RomanType() {
  // Default Constructor
  numeral = "I";
  decimal = 0;
  convert();
}

RomanType::RomanType(char * n) {
  // Specific Constructor
  numeral = n;
  decimal = 0;
  convert();
}

RomanType::~RomanType() {
  delete numeral;
}

char * RomanType::toString() {
  return numeral;
}

int RomanType::getValue() {
  return decimal;
}

void RomanType::convert() {
  /* Iterates over each character in the numeral string and adds that
     character's value to the decimal value. This method should only
     be called once during the constructor. */
  for(char c : numeral) {
    if(c == 'M') decimal += 1000;
    else if(c == 'D') decimal += 500;
    else if(c == 'C') decimal += 100;
    else if(c == 'L') decimal += 50;
    else if(c == 'X') decimal += 10;
    else if(c == 'V') decimal += 5;
    else if(c == 'I') decimal += 1;
    else decimal += 0;
  }
}

对不起,如果这个问题对某些人来说是基本的。 Java已经破坏了我。

4 个答案:

答案 0 :(得分:7)

基于范围 - for适用于数组,包含成员beginend的类,或者有适当的非成员beginend }。

你无法找到c - 样式字符串的“结束”(指向NUL - 终止char数组的指针),而不会一直走过它。

最简单的解决方法就是使用std::string,它可以使用基于范围的for

(编辑:现在我想到了,即使你直接使用char数组也要小心:

const char myString[] = "Hello";
for ( auto c : myString ) //...

因为您将处理数组的所有 6 成员,包括 NUL - 终止符。虽然你不能在这里做到这一点。)

答案 1 :(得分:1)

Char没有开头或结尾,因此基于范围的for循环不适用于char类型,而是使用较新的std::string

答案 2 :(得分:0)

我认为解决问题的最简单方法是使用其范围构造函数std::string(char* begin, char* end)创建一个字符串,并为其上的每个循环调用一个字符串。

答案 3 :(得分:0)

你已经有了答案。 如果你想用c ++ 11方式做更多的事情,试着用std :: string替换所有的char *。今天的c ++就是如果你能在没有新/删除的情况下完成你的工作,那就先试试吧。

如果您正在使用罗马数字练习,则此链接将使用精美的c ++逐步解释小数到罗马 http://jonjagger.blogspot.fr/2013/07/larry-and-jen-do-roman-numerals-in-c.html