如果我在c ++中声明一个字符串数组,例如
char name[10]
如果输入超出字符限制,您将如何处理错误?
编辑:我的任务是使用cstring而不是string。输入将是该人的全名。
答案 0 :(得分:1)
我正在拼凑说明您的说明使用<cstring>
,因此您可以使用strlen
检查字符串的长度,然后再将其“分配”到您的名称数组。
就像......
const int MAX_NAME_LEN = 10;
char name[MAX_NAME_LEN];
// ...
// ...
if (strlen(input)+1 >= MAX_NAME_LEN) {
// can't save it, too big to store w/ null char
}
else {
// good to go
}
答案 1 :(得分:1)
这是一个示例,其中setName在分配char [10]属性之前检查大小是否正常。
注意char [10]只能存储9个字符的名称,因为你需要一个字符来存储字符串结尾。
也许这就是你想要的:
#include <iostream>
#include <cstring>
using namespace std;
#define FIXED_SIZE 10
class Dummy
{
public:
bool setName( const char* newName )
{
if ( strlen( newName ) + 1 > FIXED_SIZE )
return false;
strcpy( name, newName );
return true;
}
private:
char name[FIXED_SIZE];
};
int main()
{
Dummy foo;
if ( foo.setName( "ok" ) )
std::cout << "short works" << std::endl;
if ( foo.setName( "012345678" ) )
std::cout << "9 chars OK,leavs space for \0" << std::endl;
if ( !foo.setName( "0123456789" ) )
std::cout << "10 chars not OK, needs space for \0" << std::endl;
if ( !foo.setName( "not ok because too long" ) )
std::cout << "long does not work" << std::endl;
// your code goes here
return 0;
}
答案 2 :(得分:0)
首先你的问题不明确。无论如何,我假设您想要一种方法来确保数组索引不会超出范围。
超出该范围的任何内容都会导致未定义的行为。如果索引接近范围,很可能您会读取自己程序的内存。如果索引大部分超出范围,很可能你的程序将被操作系统杀死。
这意味着未定义的行为可能意味着程序崩溃,正确的输出等。
答案 3 :(得分:0)
由于其他人提到了如何使用预定义的输入字符串执行此操作,因此这是一个从输入中读取c字符串的解决方案:
#include <iostream>
#define BUF_SIZE 10
using namespace std;
int main()
{
char name[BUF_SIZE];
cin.get(name, BUF_SIZE-1);
if (cin) //No eof
if (cin.get() != '\n')
cerr << "Name may not exceed " << BUF_SIZE-1 << " characters";
}