C ++比较长度 - 信号Sigabrt

时间:2014-11-28 15:37:23

标签: c++

我是C ++的新手。我一直在看很多教程,但我还是很新的,只是在试图熟悉它。我正在测试比较字符串长度,但我遇到了一些问题。这是代码。

*编辑:&#c;'中的[10]修复时仍然给出错误。 错误是线程1:信号Sigabrt - 如果我更改>到<然后它起作用......但它不是我想要的。

#include <iostream>
using namespace std;

int main(){
    char name[10];
    cout<<"What is your name? ";
    cin>> name;
    if(strlen(name)> 11){
        cout<<"Sorry we only handle names less than 10 letters";
    }
    return 0;

}

http://imgur.com/SNYlWbU

感谢。

2 个答案:

答案 0 :(得分:1)

cin>> name[10];您的期望。

由于name[10]char,您要求从cin获取一个字符并将其放入name[10],超出数组末尾的一个位置(最后一个有效位置是name[9})!

你想要的可能是:

cin.width(10);
cin >> name;

要求从cin获取最多9个字符,并将它们放入名称后跟一个终止空值。

编辑:

您的上一次修改修复了[10]错误,但您仍然遇到问题。如果允许用户在大小为10的缓冲区中输入10个以上的字符,则会有未定义的行为,因为您将覆盖可能包含其他变量的内存。

唯一简单的方法是在输入char数组之前使用width方法限制输入。

但真正的C++方式是使用std::string,其中大小和分配由string类本身管理。

编辑2:

这是一个简单的例子,仍然使用char数组,并通过允许一个更多并且不使用测试来安全地保证输入值小于10个字符:

#include <iostream>
using namespace std;

int main(){
    char name[11];
    cout<<"What is your name? ";
    cin.width(11);
    cin >> name;
    if(strlen(name)>=10){
        cout<<"Sorry we only handle names less than 10 letters";

    }
    return 0;
}

使用std::string

也是如此
#include <iostream>
#include <string>
using namespace std;

int main(){
    string name;
    cout<<"What is your name? ";
    cin >> name;
    if(name.length() >=10){
        cout<<"Sorry we only handle names less than 10 letters";

    }
    return 0;
}

答案 1 :(得分:0)

我和Serge一致,就字符串而言。

我会更进一步,并举例说明如何使用std::string来实现目标。我建议您查看它并将其用作字符数组的首选类型。 http://www.cplusplus.com/reference/string/string/ https://www.youtube.com/watch?v=7UtMU7D3g_s#t=121(我没有看完整件事,但可能是一个好的起点)

#include <iostream>
#include <string>

using namespace std;

int main(){
    string name;
    cin >> name;
    if(name.length() > 11){
        cout<<"Sorry we only handle names less than 10 letters";
    }
    cin.ignore();
    cin.ignore();
    return 0;

}