C ++字符串和char的比较

时间:2011-12-10 00:28:55

标签: c++ visual-studio

我正在尝试比较字符串和下面的字符:

char filter = "    " // <<== this is a tab space, so I am assuming its one char
if ( line[counter] == filter[0]){

}

请注意,该行是一个正常的字符串,定义如下:string line;。现在由于某种原因,即使没有语法错误,该语句也永远不会成立。

更新

内线是: string line = "1 90 74 84 48 76 76 80 85";

第二次更新

这是我写的完整函数:

void getResults(string line){

    int tmpSize = line.length();
    int counter = 0;
    int tmpCounter = 0;

    while(counter != MAX_No_Of_Grades){

        if(line[counter] == '\t\t'){
            counter++;
        }else{
            cout << tmpCounter << ". this is : " << line[tmpCounter] << "a" << endl;
            tempGrade[counter] += line[tmpCounter];
        }
        tmpCounter++;
    }


}

从技术上讲,该函数假设通过“tabspace”将字符串line分解为数组。但是现在counter并没有改变,因此它是一个无限循环!

3 个答案:

答案 0 :(得分:5)

我不确定您实际运行的代码是什么,因为char filter = " "行没有终止符,并且该分配绝对是非法的。您不能将字符串文字(char数组)分配给单个char变量。

如果您想确定字符串的第n个字符是否为制表符,则可能是以下代码:

if (line[counter] == '\t') {
  // match...
}

至于更新。如果在程序中键入string line = "1 90 74 84 48 76 76 80 85";,则此字符串中没有列表。只有空间。而且,'\t\t'是一对表。将单个\t放在一个标签中。

以下是示例函数的略微修改版本:

void getResults(string line)
{
    int tmpSize = line.length();
    int counter = 0;
    int tmpCounter = 0;
    while((tmpCounter < tmpSize) && (counter != MAX_No_Of_Grades))
    {
        if(line[counter] == ' ') {
            counter++;
        }
        else {
            cout << tmpCounter << ". this is : " << line[tmpCounter] << "a" << endl;
            tempGrade[counter] += line[tmpCounter];
        }
        tmpCounter++;
    }
}

此版本在while循环中进行了额外检查,以在达到line结束后停止使用字符。它还使用空格字符,因为您的测试输入不使用制表符。


如果这不是功课,您可以使用所需的所有标准库设施,我建议您研究更高级的输入策略。以下是函数的简化版本,用于提取数组中的每个数字。

#include <iostream>
#include <string>
#include <sstream>
void getResults ( const std::string& line )
{
    std::istringstream input(line);
    for (int grade=0; input >> grade;) {
        // process grade.
    }
}

如果您想删除全局变量并处理任意数量的成绩,您可以使用std::vector<>自动增加“数组”大小,因为您获得的成绩越来越高。

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
std::vector<int> getResults ( const std::string& line )
{
    std::istringstream input(line);
    std::vector<int> grades;
    for (int grade=0; input >> grade;) {
        grades.push_back(grade);
    }
    return grades;
}

答案 1 :(得分:3)

char filter = "    " // <<== this is a tab space, so I am assuming its one char

你所假设的是错的。标签空间char'\t'

你所拥有的是多个空格字符。

修改

此外:char filter = " "错误

const char * filter = " "; //更像是......

但是这个:char = '\t';可能是你想要的。

答案 2 :(得分:3)

确定。让我们逐个编写代码,以便清楚地说明。

char filter = "    " // <<== this is a tab space, so I am assuming its one char

您的第一个语句创建一个char类型的变量。与其他任何变量一样,c ++中的char类型采用值。唯一的区别是,如果你尝试将它与cout这样的语句一起使用,它将被它的ASCII值解释为一个字符。你做了什么编译和工作,但你声明的char具有c ++给字符串“”的值。 ASCII中水平制表符(TAB)的值为9.

因此,为了使用TAB的值声明数据类型为char的char:

char filter = 9;

但你不必记住所有这些价值观。与C ++为字符串“”赋值的方式相同,它将为字符赋值。如果你想获得字符的值,你必须使用''。有人提出的混淆是假设tab实际上是一组空格。选项卡由文本编辑器解释为一组空格。但它实际上是一个单一的角色。在C ++中,选项卡的字符是\ t。如果你实际把它放在一个字符串中并调用cout,你将有一个标签。 \ t是单个字符而不是两个字符的原因是因为编译器在''或“”内反斜杠后对直接字符给出“特殊”解释。

因此,以下内容将9的值赋给数据类型char:

的变量
char filter = '\t';

现在你的if语句:

if ( line[counter] == filter[0])

您的if语句是将字符与字符串行中的索引“counter”进行比较。这是可能的,因为字符串是一个字符数组(它实际上是一个类,但现在不用担心它)。但是filter不是一个数组,它只是一个字符。所以它没有索引(例如[0])。您所需要的只是您创建的变量。这种混淆通常是因为字符串的概念经常被引入而没有解释字符串不是数据类型(这就是为什么不是蓝色,这就是为什么你必须包含一个库)。

所以,只需删除你将拥有的索引:

if (line[counter] == filter)

当然,您可以直接将其与标签进行比较

if (line[counter] == 9);

if (line[counter] == '\t');

希望这能让您更好地了解实际情况。