C++ 意外的星号输出
此程序用于在数组中每次出现数字1时打印星号。但是,输出是无限多个星号 您的代码存在多个问题。最重要的是,循环超出了x数组的界限,因此第一个循环会破坏周围的内存。并且您没有初始化y[1],因此它将有一个随机值,然后您的第二个循环将递增。这可能就是为什么您在输出中看到这么多星号的原因-y可能以一个较大的值开始 请尝试类似以下内容:C++ 意外的星号输出,c++,C++,此程序用于在数组中每次出现数字1时打印星号。但是,输出是无限多个星号 您的代码存在多个问题。最重要的是,循环超出了x数组的界限,因此第一个循环会破坏周围的内存。并且您没有初始化y[1],因此它将有一个随机值,然后您的第二个循环将递增。这可能就是为什么您在输出中看到这么多星号的原因-y可能以一个较大的值开始 请尝试类似以下内容: #include <iostream> #include <cstdlib> using namespace std; int main()
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
int num;
int y [11];
cout << "Enter the amount of numbers you would like generated: " << endl;
cin >> num;
cout << endl;
int x[num];
for (int j=0; j<=num; j++)
{
x[j]=(rand()%10)+1;
}
for (int j=0; j<=num; j++)
{
switch (x[j])
{
case 1:
y[1]+=1;
}
}
for (int a=0;a<=y[1]+1; a++)
{
switch (a)
{
case 0:
cout << "1: ";
break;
default:
cout << "*";
}
}
}
没有理由为y使用数组,因为你只是白白浪费了它11个插槽中的10个而已。只有在实际跟踪多个计数器时,才使用数组更有意义:
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
int num;
cout << "Enter the amount of numbers you would like generated: " << endl;
cin >> num;
cout << endl;
cout << "1: ";
for (int j = 0; j < num; ++j)
{
if ((rand() % 10) == 0)
cout << "*";
}
cout << endl;
return 0;
}
很多时候,您在StackOverflow上得到的响应与您提问的方式直接相关,请参见:。也就是说,通常可能存在语言障碍等。。这在一定程度上掩盖了你在问题上付出的努力或问题的确切性质。花点时间阅读上面的链接,提出你的问题,这样这里的人就可以更容易地帮助你解决你正在努力解决的具体问题 <>你的原始代码与外来变量纠结在一起,包括C特性,而不是C++标准的一部分,并用多种方式调用未定义的行为。使用尽可能多的变量在代码中存储不同的值并没有什么错,但是考虑需要什么并限制跟踪的不同值的数量可以帮助您保持代码逻辑正常。让我们首先看看整数数组y 将y声明为11个未初始化元素的数组。在声明时,y中的每个元素都是不确定的,这意味着每个元素只包含随机垃圾值,任何在初始化y元素之前访问该元素的尝试都会调用未定义的行为—您可能不相信您的代码从此点起将正确运行。声明为int,每个元素中保存的不确定值的范围为-2147483648到2147483647,即4字节整数值的范围 生成可被10整除的随机值时,执行:
int y [11];
也就是y[1]=y[1]+1;。然而,问题是y[1]在这一点上是不确定的,它可以是任何东西,您刚刚调用了未定义的行为,您的代码可以执行任何操作,从“看起来行为正确”到“SegFault”
继续,您的下一个声明是:
y[1]+=1;
这是一个C可变长度数组VLA的声明。VLA的C++标准不允许,但作为GNU扩展提供,例如,STD=GNU+ 11。如果您没有使用提供VLA的扩展,那么您的代码甚至不应该编译。即使你使用的是扩展的,你的编译器也应该警告你,它不是C++标准的一部分。
如果要使用长度未知的数组,请使用以下命令为x动态分配:
然后您就有了存储空间来保存num整数数组。当不再需要删除[]x时,应释放内存
如前所述,无论您如何分配x,您都会尝试读取x末尾以外的内容:
示例使用/输出
但是,如果您确实希望存储测试生成的随机数是否可被10整除的1和0结果序列,您可以简单地按照上面的讨论分配x,并根据测试结果填充值rand%10==0。要验证逻辑,您可以输出rand%10的结果和存储在x[j]中的值,以确认您输出的星号数正确
只需对变量进行一点改组,并用简单的if子句替换不必要的switch语句,您就可以做一些类似于您最初尝试的事情,例如
$ ./bin/asterisks_min
Enter the amount of numbers you would like generated: 20
1: ****
如果我理解了代码的最终目标,那么它确认了对于每个可以被10整除的随机值,您都在输出*
最后,在使用rand时,在您第一次调用rand之前,您应该为半随机数生成器设置种子。您可以使用半唯一的值,如使用time NULL从历元开始的秒数,也可以提供一个固定的种子,允许您复制随机集以供以后使用和评估
仔细检查一下,如果有任何问题,请告诉我。虽然您的问题并不完全清楚,您的代码也有点混乱,但这些问题往往是最需要帮助的问题。使用调试器逐步检查代码会显示出什么情况?对于int j=0;j表示int j=0;jMinimum complete verified example?这不是免费的调试服务。如果您仍然无法解决问题,请尝试使用调试器调试您自己的代码,将有问题的代码缩小到一个范围。还有,v
可变长度数组,如int x[num ]不是标准特征,至少不是yt.btw,int x[num ]是可变长度数组VLA,不是标准C++,而是编译器扩展。我发现y是多余的,它归结为如果RAN% % 10=0 { /*输出星号*/} -也许我读错了。Hehe…谢谢,我猜通过不确定的y[1]+=1;,我把目光从球上移开。我想除了测试生成的数字是否可以被10整除并输出一个星号(如果可以的话),我看不出这是怎么做的。在这种情况下,您不需要x或y,只需循环num次,并以星号形式输出,如我上面的注释所示。我遗漏了什么?OP的代码使用y[1]来跟踪rand%10+1产生值1的次数。最后一个循环使用y[1]确定要输出的星号数。是的,如果你想简化代码,你可以去掉x和y,但这不是OP问题的重点。是的,我明白了,但我想说的是,通过简单地循环int j=0,你可以产生相同的星号输出;j
y[1]+=1;
int x[num];
int *x = new int[num];
for (int j=0; j<=num; j++)
#include <iostream>
#include <cstdlib>
using namespace std;
int main (void) {
int num;
srand (time(NULL)); /* seed random number generator */
cout << "Enter the amount of numbers you would like generated: ";
if (!(cin >> num)) { /* validate integer input */
cerr << "error: invalid input.\n";
return 1;
}
cout << "\n1: ";
for (int j = 0; j < num; j++) /* loop num times */
if (rand() % 10 == 0) /* divisible by 10? */
cout << "*"; /* output asterisks */
cout << '\n'; /* output POSIX compliant newline at end */
}
$ ./bin/asterisks_min
Enter the amount of numbers you would like generated: 20
1: ****
#include <iostream>
#include <iomanip>
#include <cstdlib>
using namespace std;
int main (void) {
int num;
srand (time(NULL)); /* seed random number generator */
cout << "Enter the amount of numbers you would like generated: ";
if (!(cin >> num)) { /* validate integer input */
cerr << "error: invalid input.\n";
return 1;
}
int *x = new int[num]; /* allocate, VLA not standard in C++ */
for (int j = 0; j < num; j++) { /* loop num times */
int v = rand() % 10; /* rand mod 10 */
if (v == 0) /* divisible by 10? */
x[j] = 1; /* store 1 */
else
x[j] = 0; /* store 0 */
/* debug output, rand % 10 & contents of x[] */
cout << "v: " << v << " -> x[" << setw(2) << j << "]: "
<< x[j] << '\n';
}
cout << "\n1: "; /* simply output prefix */
for (int a = 0; a < num; a++) /* then loop over stored 1's */
if (x[a] == 1)
cout << "*"; /* output * for each 1 value */
cout << '\n'; /* tidy up with newline */
delete[] x;
}
$ ./bin/asterisks
Enter the amount of numbers you would like generated: 20
v: 6 -> x[ 0]: 0
v: 9 -> x[ 1]: 0
v: 1 -> x[ 2]: 0
v: 1 -> x[ 3]: 0
v: 3 -> x[ 4]: 0
v: 8 -> x[ 5]: 0
v: 0 -> x[ 6]: 1
v: 3 -> x[ 7]: 0
v: 9 -> x[ 8]: 0
v: 8 -> x[ 9]: 0
v: 2 -> x[10]: 0
v: 5 -> x[11]: 0
v: 9 -> x[12]: 0
v: 9 -> x[13]: 0
v: 8 -> x[14]: 0
v: 3 -> x[15]: 0
v: 0 -> x[16]: 1
v: 0 -> x[17]: 1
v: 3 -> x[18]: 0
v: 2 -> x[19]: 0
1: ***