为什么我的程序在字符数组填充过多时会进入无休止的循环? 我试图编写一个C++程序,让用户输入一个正整数和一个名字,并将其输入到固定大小的数组中并打印出来。当我在第一次启动程序时输入正确的数据时,程序似乎工作正常

为什么我的程序在字符数组填充过多时会进入无休止的循环? 我试图编写一个C++程序,让用户输入一个正整数和一个名字,并将其输入到固定大小的数组中并打印出来。当我在第一次启动程序时输入正确的数据时,程序似乎工作正常,c++,arrays,loops,while-loop,C++,Arrays,Loops,While Loop,我遇到的问题是为Char数组输入不正确的值(超过字符计数)。如果我为char数组输入了不正确的值,它会像预期的那样发出警告消息,但一旦我输入了正确大小的单词,程序就会进入无休止的循环,询问已经输入的值。 我的代码如下: #include <iostream> #include <cstring> using namespace std; int main() { int count = 1; int num = 0; // variable for p

我遇到的问题是为Char数组输入不正确的值(超过字符计数)。如果我为char数组输入了不正确的值,它会像预期的那样发出警告消息,但一旦我输入了正确大小的单词,程序就会进入无休止的循环,询问已经输入的值。 我的代码如下:

#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    int count = 1;
    int num = 0; // variable for positive integer
    char name[31]; //char array to store name inside

    while(count != 0){

        cout << "Please enter the number: " << endl;
        cin >> num;
        while(num < 1){
            cout << "Number must be a positive integer!" << endl;  //Loop that checks whether the 
            cin >> num;                                           // entered number is a positive 
        }                                                        //  integer.

        cout << "Please enter the name: " << endl;
        cin >> name;
        while(strlen(name) > 30){                                        //Loop that checks whether the
           cout << "Name exceeds the allowed character count!" << endl; //entered name exceeds the
           cin >> name;                                                // allowed character count.
        }

        --count;
    };

    cout << num << " " << name;

    return 0;
}
#包括
#包括
使用名称空间std;
int main()
{
整数计数=1;
int num=0;//正整数的变量
char name[31];//存储名称的char数组
while(计数!=0){
库特数;
while(num<1){
cout num;//输入的数字是正数
}//整数。
姓名;
while(strlen(name)>30){//循环,用于检查
cout name;//允许的字符数。
}
--计数;
};

cout这个循环有问题:

 while(strlen(name) > 30) {                                        //Loop that checks whether the
       cout << "Name exceeds the allowed character count!" << endl; //entered name exceeds the
       cin >> name;                                                // allowed character count.
 }
while(strlen(name)>30){//检查
cout name;//允许的字符数。
}
strlen()如果有31个字符后跟一个
'\0'
,则
将返回31。因此,这已经超出了31个元素长数组所能容纳的范围。但这不是最小的问题-一旦从
cin
加载的字符超过数组的大小,您就会遇到未定义的行为区域-从C++17开始,
cin
将如果您告诉它这样做的话,请愉快地写入超过c样式数组容量的内容


我建议您使用
std::string
s而不是原始的C数组。它们为您解决了以null结尾的字符串技术问题。

此循环有问题:

 while(strlen(name) > 30) {                                        //Loop that checks whether the
       cout << "Name exceeds the allowed character count!" << endl; //entered name exceeds the
       cin >> name;                                                // allowed character count.
 }
while(strlen(name)>30){//检查
cout name;//允许的字符数。
}
strlen()如果有31个字符后跟一个
'\0'
,则
将返回31。因此,这已经超出了31个元素长数组所能容纳的范围。但这不是最小的问题-一旦从
cin
加载的字符超过数组的大小,您就会遇到未定义的行为区域-从C++17开始,
cin
将如果您告诉它这样做的话,请愉快地写入超过c样式数组容量的内容


我建议您使用
std::string
s而不是原始的C数组。它们为您解决了以null结尾的字符串的技术问题。

如果您超过
name
数组的大小,这是未定义的行为。您的代码基本上是在检查UB,这是不可能的。这就是为什么基本上每个人都使用
std::字符串
而不是固定大小的数组。-同时读取底部的链接。写入超出
名称
范围的内容可能会覆盖堆栈上的
计数
,从而导致“无止境”循环。这只是一个可能的解释,在程序集/指令级别会发生什么。@David它是UB,简单明了。任何行为都是可能的。你甚至不能尝试对此进行推理。你不应该尝试。修复UB是唯一明智的方法。如果你超过
名称
数组的大小,这是未定义的行为。你可以r代码基本上是在尝试检查UB,这是不可能的。这就是为什么基本上每个人都使用
std::string
而不是固定大小的数组。-阅读底部的链接。写入超出
name
范围的内容会覆盖堆栈上的
count
,这会导致“无止境”循环。这只是一个可能的解释,在程序集/指令级别会发生什么。@David它是UB,简单明了。任何行为都是可能的。你甚至不能尝试对此进行推理。你不应该尝试。修复UB是唯一明智的方法。读取
字符*
总是会在结尾追加一个
'\0'
输入,这里没有问题。唯一的问题是写越界,因为您不可能从指针检查数组的长度。C++17对此事实没有任何更改,但在C++20中行为将发生变化(将完全删除
char*
的重载)@churill谢谢你指出这一点。我真的应该在发布这类胡说八道之前开始检查cppreference上的所有内容。读取
char*
将始终在输入末尾附加
'\0'
,这里没有问题。唯一的问题是写越界,因为您不可能从poi检查数组的长度nter.C++17并没有改变这一事实,但在C++20中行为将发生变化(char*
的重载将被完全删除)。@churill感谢您指出这一点。我真的应该在发布这种胡说八道之前开始检查cppreference上的所有内容。