输出不符合预期

时间:2020-07-24 05:38:41

标签: 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*sizeof(int));
    cin>>*n;
    int len;
    len = log10(*n) + 1;
    for(int i=0;i<len;i++)
    {
        cout<<n[i]<<endl;
    }
}

3 个答案:

答案 0 :(得分:1)

cin >> *n时,您不是逐位读取数字,而是整体读取。

因此,当您cin >> *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;
}

但是,最简单的方法是将数字作为字符串而不是数字读入,然后逐个打印出字符(即数字)。

char str[1000];

cin >> str;

for (char *s = str; *s; ++s)
{
    cout << *s << endl;
}

您还可以将数字转换为字符串,然后执行相同的操作:

#include <cstring>

using namespace std;

...

char str[1000];

sprintf(str, "%d", *n);

for (char *s = str; *s; ++s)
{
    cout << *s << endl;
}

-------原始答案:

如果要打印n的第一个元素:

cout << *n;

cout << n[0];

您的代码

    for(int i=0;i<len;i++)
    {
        cout<<n[i]<<endl;
    }

表示

cout << n[0] << endl;
cout << n[1] << endl;
cout << n[2] << endl;
 
...

cout << n[len-1] << endl;

答案 1 :(得分:1)

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

例如,如果输入为123n[0]存储123n[1],n[2],...n[999]存储垃圾值。 要将值存储在n[1]中,您将不得不再次使用cin

答案 2 :(得分:1)

出于某种原因,您认为

int* n=(int*)malloc(1000*sizeof(int));
cin>>*n;

将读取一个数字,并将每个数字放入动态数组n的不同元素中。如果发生这种情况,那么您的其余代码将正常工作。但是,当然不是。取而代之的是,将读取的数字放入*n(或同一事物,n[0])中,而其余的动态数组元素未初始化,这说明了您看到的垃圾值。

我正在努力理解为什么您认为您的代码可能会以您想要的方式运行。我想您只是一个乐观的人,并认为如果您足够努力地希望编译器能够理解。这似乎是初学者之间非常普遍的态度。不幸的是编程不是那样的。