当一些非整数的无效输入时,在print语句的开头加零

问题描述 投票:2回答:1

我是制作一个程序,对从命令行给出的整数数组进行排序,而我的程序下面似乎完全如此,即使错误检查我遇到了一个问题,我很困惑为什么会发生这种情况。当我做一个./permarray 22 3d test2 1 -5 5 0 -29 2的测试用例给出一个输出,虽然它确实正确地排序数字并打印出3dtest2不是整数,但它在这个print语句的开头放置了两个0。为什么会发生这种情况是因为如何对这些无效语句进行错误检查?

permarray_main.c

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

int permarray(int* arr, size_t len);
int main(int argc, char *argv[])
{
    bool any_valid = false;   
    int i;
    if(argc > 1){
        int *arr = NULL;
        char *endptr = NULL;
        int check, sum;
        size_t len = (size_t)argc-1;

        arr = malloc(len * sizeof *arr);
        for(i = 0; i < len; i++){
            check = strtol(argv[i+1], &endptr, 10);
            if(endptr != argv[i+1] && *endptr == '\0'){
                arr[i] = check;
                any_valid = true;
            }else{
                fprintf(stderr, "Error: %s is not a valid integer!\n", argv[i+1]);
            }

        }
        if(any_valid){
        permarray(arr, len);
        }


      }else{
          fprintf(stderr, "Error: Expected a list of integers as arguments!\n");
      }
    }

permarray.c

int permarray(int a[], int l)
{
    int i,j,t,k;
for(i=0,j=0;i<l;i++)
   {
    if(a[i]>0)
    continue;
    else
       {
        t=a[i]; //swapping positive elements at beginning with negative ones
        a[i]=a[j];
        a[j]=t;
        j++;
       }
     }


   for(i=j;i<l-1;i++) //starting from positive values
   {
    for(k=i+1;k<l;k++)
    {
     if(a[i]>a[k])
      {
      t=a[i]; //bubble sorting
      a[i]=a[k];
      a[k]=t;
       }
      }
     }
for(i=0;i<l;i++){
printf("%d ",a[i]);
}
printf("\n");
}

当前输出

Error: 3d is not a valid integer!
Error: test2 is not a valid integer!
0 0 -5 0 -29 1 2 5 22

期望的输出

Error: 3d is not a valid integer!
Error: test2 is not a valid integer!
-5 0 -29 1 2 5 22
c loops printf permutation
1个回答
1
投票

失败的转换需要有效地减少排序中的len

  int n = 0;  // Count valid conversions.
  for (i = 0; i < len; i++) {
    check = strtol(argv[i+1], &endptr, 10);
    if (endptr != argv[i+1] && *endptr == '\0') {
      // arr[i] = check;
      arr[n++] = check;
    } else {
      fprintf(stderr, "Error: %s is not a valid integer!\n", argv[i+1]);
    }
  }

  if(n > 0) {
    permarray(arr, n);
  }


// for (i=0;i<l;i++){
for (i=0;i<n;i++){
  printf("%d ",a[i]);
}
© www.soinside.com 2019 - 2024. All rights reserved.