0

我有一个 int 数组,比如说... 1000 个元素。用户输入 128 并将数组填充为 821。在说之前,让我说,为了其他功能的简单性,它必须向后。为了得到我使用的长度

    int count = 0;
    for (int i = 0; array1[i] != '\0'; ++i)
    {
        count++;
    }       

这很好用。直到他们输入一个带有 0 的数字,例如 0 或 100。数组填充为 001,但测试立即停止它,因为 0 等于 '\0'

我不能使用 sizeof(array1)/sizeof(*array1) 因为当我去打印数组时,我会得到大量的零,然后是数字。它确实打印正确,但不是我想要的。

有什么解决办法吗?

4

4 回答 4

1

我认为更好的方法是在使用之前用无效值(例如-1)填充整个数组。根据您的描述,通过说“无效”,它可以是 0-9 以外的任何值。

memset(array1, -1, sizeof(array1));
// doing things

为什么不将数字保存为字符,因为它们来自用户输入?只需使用 '0' 而不是 '\0' 来表示零,所以你没有问题。strlen如果你保证数组末尾总是有 '\0',你甚至可以直接使用它来获取长度:

// array size is 1001 instead of 1000 to reserve a '\0' in the end
char array1[1001] = {'8', '2', '1'}
size_t count = strlen(array1);
于 2012-09-28T06:34:32.013 回答
0

您需要做的是将数字转换为相应的字符。

可以说,你有1230. 在您的数组中,您实际存储1 + '0'、和。是已打印在其上的键的 ASCII 值。2 + '0'3 + '0''0''0'0

这样你就永远不会'0'混淆\0.

于 2012-09-28T06:35:14.220 回答
0

您可以确定您的号码的位数,然后使用计算出的大小动态分配数组。

于 2012-09-28T06:35:58.723 回答
0

我能想到的方法有两种:

  1. 在用户输入的每个元素之后增加大小
  2. 你用一个用户永远不会输入的数字来标记结尾

例如在第一种情况下:

char array1[1000];
int count = 0;

while(!the_end)
{
    std::cin >> array1[count++]
}

// From now, every time you add elements to the array, increase  the "size" variable

std::cout << "Size: " << count << std::endl;

对于第二种情况,有一些方法,但我认为最适合您的方法是在开始从用户那里获取输入之前用无效值填充数组:

char array1[1000] = {-1};
// Start getting the input...

int count = 0;
for(int i = 0; array1[i] != -1; ++i)
{
    count++;
}

std::cout << "Size: " << count << std::endl;

注意:如果你坚持这一点,那么你的代码可能有一些设计缺陷。为了使设计更好,您将使用我建议的第一种方法,而不是在之后尝试找到尺寸。或者更好的是,您可以按照std::vector评论中的建议使用,或者至少可以对您输入到数组的元素进行某种类型的“跟踪”。

于 2012-09-28T06:40:26.357 回答