需要用户输入字符串/检查字符串长度(C++)

Posted

技术标签:

【中文标题】需要用户输入字符串/检查字符串长度(C++)【英文标题】:Need user to input string /check string length (C++) 【发布时间】:2009-04-17 10:33:18 【问题描述】:

我需要从用户那里接受一串 5 个数字(只有 5 个)。 我应该使用

istringstream 

同样的?

这样的事情我就不能逍遥法外吗?

int main()

    char *InputMain;
    InputMain=(char *)malloc(5+1);
    cout << "Enter the number : " <<endl;
    cin.getline ( InputMain, 5, '\n' );              // Input goes into InputMain
    cout << "The number entered is : " << InputMain <<endl;
    cin.get();

然后是下一部分..

我如何确保用户只输入 5 个字符?也许如果用户输入超过 5 个字符,我应该显示一个警告,说只允许 5 个字符..

还有一个问题,因为这本质上是一个字符串,我需要通过解析字符串中的每个字符并检查相应的 ASCII 值(对于数字)来验证输入是否仅为数字。对吗?

【问题讨论】:

这听起来很像家庭作业 【参考方案1】:

不幸的是,没有可移植的方法来限制 C++ 中输入的字符数。但是无论您使用什么平台都会提供一些机制:例如在 Windows 上,查找 Console functions。

如果您使用来自cin 的普通旧C++ iostreams 输入,最好使用istream&amp; getline(istream&amp;, string&amp;) 将初始文本读入std::string——这将防止缓冲区溢出,因为strings 调整大小有必要的。 (涉及getline(InputMain, 5, '\n') 的代码在技术上是安全的,因为它不会将超过 5 个字符读入InputMain,但是此代码很脆弱——如果您以后决定需要 6 个字符,您很容易忘记更新您的通话到malloc(),导致崩溃。另外,你需要记住free(InputMain)。但正如我所说,改用string。)

关于解析:

无论您是使用getline(cin, str) 或某些特定于平台的代码将输入读入string,一旦输入,您需要以数字的形式将其取出。这就是 istringstream 类有用的地方——它允许您将现有的 string 视为要读取的流,因此您可以使用格式化输入 &gt;&gt; 运算符:

string str;
if (!getline(cin, str)) 
    cerr << "Something went seriously wrong...\n";


istringstream iss(str);
int i;
iss >> i;    // Extract an integer value from the stream that wraps str

if (!iss) 
    // Extraction failed (or a more serious problem like EOF reached)
    cerr << "Enter a number dammit!\n";
 else if (i < 1000 || i > 9999) 
    cerr << "Out of range!\n";
 else 
    // Process i

如果您使用的是 C++ iostream,实际上您可以直接从 cin 提取,而不是通过 stringistringstream

int i;
cin >> i;    // Extract an integer value from cin

但是,这可能会产生微妙的不良影响;值得注意的是,用户键入的行上的任何其他字符(特别是当他们按 Enter 时键入的'\n')将保留在输入缓冲区中,以供下一次&lt;&lt; 操作读取。通常这无关紧要,但有时确实如此:例如如果您跟进cin.get();,预计这将等待按键,它不会 - 它只会读取'\n'(或用户键入的第一个非数字字符)。

【讨论】:

你的意思是我应该使用这样的东西吗? #include #include using namespace std; int main() 字符串 InputMain; cout > InputMain; //---> 这也可以吗? cout @halluc1nati0n:抱歉,我给出了两种替代方法,而不是单一方法。我会尝试修复帖子以澄清事情。 @halluc1nati0n:好的,现在看一下。简而言之:不,不要使用“cin >> InputMain;” -- 要么使用 "int i; cin >> i;"或“字符串 s; getline(cin, s); int i; istringstream iss(s); iss >> i;”。 @ j_random_hacker :我确实喜欢 istringstream 方法。我添加了 sstream 标头并且代码确实可以编译,但不知何故我没有让它工作。有什么原因吗? @halluc1nati0n:一旦我添加了 iostream 和 sstream 标头,就可以使用,添加“使用命名空间 std;”在此之下并将代码 sn-p 包装在 main() 中。此外,如果您希望用户在号码无效时重新输入号码,您显然需要更改错误处理代码(例如,添加一个 while 循环并在号码有效时中断)。

以上是关于需要用户输入字符串/检查字符串长度(C++)的主要内容,如果未能解决你的问题,请参考以下文章

C ++根据用户输入字符串长度创建二维数组

将字符串 c++ 截断为长度而不剪切单词

如何在 C++ 中将字符串转换为 int?

如何检查字符串中的数据是不是是 C++ 上的数字?

C++中的线程

在 C++ 中验证来自用户的整数输入