【问题标题】:Arrays remove the rest number that get printed out in C数组删除在 C 中打印出来的剩余数字
【发布时间】:2015-12-14 17:27:57
【问题描述】:

我尝试在 C 中创建一个动态数组,但我不会让它工作,所以我尝试使用一个普通数组,我只删除打印出来的其余数字。 我有一个数组:

int array[100];

这个数组将存储 100 个数字,这些数字将使用 for 循环扫描。在那个 for 循环中,我确实有一个 if 语句:

if(array[i] == 0)
{
    break;
}

所以如果我扫描数字 0,for 循环将中断,代码将继续。 例如,当我扫描普通号码时,我想扫描 20 个号码。该数组有 100 个数字点,但我只写 1-20,然后我键入 0,这会使循环中断。 然后我确实有一个用于打印数组的 for 循环。 printf 打印整个数组 1-20 并且在 20 之后它将开始打印出其余 80 个没有分配数字的数字。 所以我的问题是,我如何才能删除在我实际扫描的 1-20 个号码之后打印出来的所有这些剩余号码?我只想显示扫描的数字,而不是全部 100。

【问题讨论】:

  • 很好的描述,但是如果我们能看到代码,这个问题会更容易回答。
  • 循环变量i是否不包含中断后扫描的整数个数?
  • 休息后,它进入一个排序函数,将所有数字从最低到最高排序。休息后它不会扫描任何东西。

标签: c arrays rest


【解决方案1】:

为什么不保留一个knt 变量并在每次扫描一个数字时递增它,然后你就会知道数组有多大。所以要打印它,你可以这样做:

for(int a = 0; a < knt; ++a) {
    printf("%d", array[a]);
}

【讨论】:

  • 所以我应该让 knt = 1;第一次然后在for循环中我会做knt++;对吗?
  • @sameizad 不要以knt = 0 开头,因为您在扫描任何内容之前声明了 knt。 @vish4071 有一个更简单的解决方案,所以我会使用他的。
  • 是的,但在这之前,我试着做你刚刚写的。如果我从 knt = 0 开始,循环将不会开始,因为 a !
  • @sameizad 您需要两个单独的循环,首先扫描数字并每次增加 knt ,然后当您完成扫描数字时 knt 将为 20,因此您可以按照我上面所述创建一个新循环
【解决方案2】:

根据您的描述,我想您只需要存储最后一个i(来自array[i])并打印所有元素的数组,直到最后一个数字。您可以通过将循环运行到&lt;&lt;= 这个最新的索引来选择是否要拖尾零。

【讨论】:

  • 当我有 100 个点并且只扫描 20 个时,我如何才能找到最后一个 i?例如,我将如何找到 20 i?假设我们现在知道我将扫描 20 个整数,但稍后我将无法知道用户将在输入中写入多少个整数。
  • 中断循环的if条件应该有最后一个i
【解决方案3】:

使用这个:

i=0;
while(array[i]){
    printf("%d\n",array[i++]);
}

编辑:
在 cmets 和所有之后,我想我会编写一个简单的代码供您在您的场景中使用。我已经评论了代码。它应该可以帮助你理解一切。如果您仍有疑问,请随意。

#include<stdio.h>

void sortera(int array[], int n, int m)
{
    int tmp,i,j;
    for(i=n; i<m; i++)
    {
        for(j=n;j<m; j++)
        {
            if(array[j]>array[j+1])
            {
                tmp=array[j];
                array[j]=array[j+1];
                array[j+1]=tmp;
            }
        }
    }
}

int main(){
    int i,c;
    int a[100];
    c=0;        //this c keeps the count
    for(i=0;i<100;i++){     //since 100 is the max limit
        scanf("%d",&a[i]);
        c++;                //this is what @JackWilliams meant you to do
        if(a[i]==0)
            break;
    }
    printf("\nInput array\n");
    i=0;
    while(a[i])
        printf("%d\n",a[i++]);      //this is my snippet that prints all values
    //now sorting. I changed the algo a bit that you wrote (basic idea is same though)
    //This code sorts the array elements in range n..m, inclusive of n and xclusive of m
    //Since arrays in c are (by default) passed by reference, you just need to sort them. No return value is required
    sortera(a,0,c);
    //Now I use @JackWilliam's method to print the array
    printf("\nSorted Array:\n");
    for(i=0;i<c;i++)
        printf("%d\n",a[i]);
    return 0;
}

【讨论】:

  • 嗯,这可以正常工作并为我打印数组,就像我想要的那样,但我确实有一个功能可以为我排序所有数字,所以我有这个功能;排序(数组,我,j);但是当我添加您的代码时,它不会打印出已排序的数字,而是会打印出未排序的数字。
  • 我的代码只是打印从开始到 array[i] 为 0 的点的数组。然后它不打印任何东西。如果您的排序函数从i..j 正确排序数组,其中array[j+1] 的值应为0,则此行正确打印数组。
  • 可能是你的排序功能有问题。如果您发布整个代码,我想我可以提供帮助,否则不可能。
  • 我试着按照你说的做,它将所有数字从 1-10 排序,但不是 >10 我不明白为什么。下面是函数的代码:pastebin.com/77sZgSCD
  • 您在那里对 10 个元素进行排序。在您的循环中,只需将 10-1 替换为 20-1(对于 20 个元素)。它应该工作。无论如何,如果您需要一般情况,则需要计算实际输入的元素数量。
【解决方案4】:

如果您知道(或可以知道)数组的大小(不是创建的大小,而是使用了多少元素),则为其创建一个变量,而不是与零进行比较,而是检查如果变量 'i' 达到这个索引。

这里对动态数组进行了很好的讨论:How to declare a dynamic integer array in ANSI - C using malloc and put input integers into it?

这里,使用更精细的结构:Explanation of code (linked list C)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多