C++ 输出不符合预期

C++ 输出不符合预期,c++,pointers,C++,Pointers,我的程序的想法是打印n的单个数字。 但是,它在第一行中同时打印所有数字,在随后的行中打印一组零或垃圾值。 我想访问每个单独的数字,就像我们可以访问数组一样。 假设输入是1234,为什么不打印1\n2\n3\n4 #include <iostream> #include <cmath> #include <stdlib.h> using namespace std; int main() { int* n=(int*)malloc(1000*sizeo

我的程序的想法是打印n的单个数字。 但是,它在第一行中同时打印所有数字,在随后的行中打印一组零或垃圾值。 我想访问每个单独的数字,就像我们可以访问数组一样。 假设输入是1234,为什么不打印1\n2\n3\n4

#include <iostream>
#include <cmath>
#include <stdlib.h>
using namespace std;

int main()
{
    int* n=(int*)malloc(1000*sizeof(int));
    cin>>*n;
    int len;
    len = log10(*n) + 1;
    for(int i=0;i<len;i++)
    {
        cout<<n[i]<<endl;
    }
}
当您输入>>*n时,您不会逐位读取数字,而是整体读取

因此,当您输入>>*n并键入1234时,*n变为1234

如果要打印所有单个数字,如1\n2\n3\n4,则需要自己分隔这些数字:

int pos = 1;

while (*n != 0)
{
    n[pos] = n % 10;
    n /= 10;
    ++pos;
}

for (--pos; pos > 0; --pos)
{
    cout << n[pos] << endl;
}

cout当你输入时,你不是一个数字一个数字地读,而是作为一个整体来读

因此,当您输入>>*n并键入1234时,*n变为1234

如果要打印所有单个数字,如1\n2\n3\n4,则需要自己分隔这些数字:

int pos = 1;

while (*n != 0)
{
    n[pos] = n % 10;
    n /= 10;
    ++pos;
}

for (--pos; pos > 0; --pos)
{
    cout << n[pos] << endl;
}

coutn被声明为指向可存储1000个整数实体的内存位置的指针。当您使用cin>>*n;,读取整数值作为输入,并将其存储在1000个块中的第一个内存块中。整数的各个数字不存储在单独的块中,因此不能单独打印它们

例如,如果输入为123, n[0]存储123,n[1],n[2],…n[999]存储垃圾值。 要在n[1]中存储值,必须再次使用cin。

n被声明为指向可存储1000个整数实体的内存位置的指针。当您使用cin>>*n;,读取整数值作为输入,并将其存储在1000个块中的第一个内存块中。整数的各个数字不存储在单独的块中,因此不能单独打印它们

例如,如果输入为123, n[0]存储123,n[1],n[2],…n[999]存储垃圾值。
要在n[1]中存储值,必须再次使用cin。

出于某种原因,您认为

int* n=(int*)malloc(1000*sizeof(int));
cin>>*n;
将读取一个数字,并将每个数字放入动态数组n的不同元素中。如果发生了这种情况,那么剩下的代码就可以正常工作了。但当然不是。相反,读取的数字被放入*n或n[0],其余的动态数组元素未初始化,这解释了您看到的垃圾值


我很难理解为什么您认为您的代码可能以您想要的方式运行。我猜你只是一个乐观的人,如果你想努力,编译器会理解的。这似乎是初学者中相当普遍的态度。不幸的是,编程不是这样的。

出于某种原因,您认为

int* n=(int*)malloc(1000*sizeof(int));
cin>>*n;
将读取一个数字,并将每个数字放入动态数组n的不同元素中。如果发生了这种情况,那么剩下的代码就可以正常工作了。但当然不是。相反,读取的数字被放入*n或n[0],其余的动态数组元素未初始化,这解释了您看到的垃圾值


我很难理解为什么您认为您的代码可能以您想要的方式运行。我猜你只是一个乐观的人,如果你想努力,编译器会理解的。这似乎是初学者中相当普遍的态度。不幸的是,编程不是这样的;从标准输入读取最多一个整数,并将其存储在n的第一个元素中。该数组中的所有其他元素都未初始化。不清楚你期望什么。是的,你正在打印n的单个元素,但是它们没有保证值。不要在C++中使用Malc,而是使用NeX[],或者更好的STD::VECITRI已经多次阅读你的描述,因为它让我困惑。根据您对输出的描述,我认为元素实际上是指数字。当你说n的元素时,程序员会看到数组n,并假设你说的是该数组中的所有元素。如果要打印单个整数上的数字,则不需要数组或任何堆分配。你需要一个循环,和一些非常简单的数学,基本上是长除法。您很可能会发现许多有关堆栈溢出的问题,这些问题都有解决方案;cin>>*n;从标准输入读取最多一个整数,并将其存储在n的第一个元素中。该数组中的所有其他元素都未初始化。不清楚你期望什么。是的,你正在打印n的单个元素,但是它们没有保证值。不要在C++中使用Malc,而是使用NeX[],或者更好的STD::VECITRI已经多次阅读你的描述,因为它让我困惑。根据您对输出的描述,我认为元素实际上是指数字。当你说n的元素时,程序员会看到数组n,并假设你说的是该数组中的所有元素。如果要打印单个整数上的数字,则不需要数组或任何堆分配。你需要一个循环,和一些非常简单的数学
基本上是长除法。您很可能会发现许多有关堆栈溢出的问题,这些问题都有解决方案;让我们更正你的术语,因为它会误导你。只有一个内存块。它的大小为1000*sizeofint字节。它被用作整数数组。在数组的特定索引处引用一段数据时,将其称为数组元素。不要把它称为内存块。让我们更正一下你的术语,因为它会误导你。只有一个内存块。它的大小为1000*sizeofint字节。它被用作整数数组。在数组的特定索引处引用一段数据时,将其称为数组元素。不要称之为内存块。
int* n=(int*)malloc(1000*sizeof(int));
cin>>*n;