我要制作一个程序,该程序对从命令行给出的整数数组进行排序,而下面的程序即使在进行错误检查的情况下也表现得非常完美,我遇到了一个问题,我对其发生的原因感到困惑。当我做一个./permarray 22 3d test2 1 -5 5 0 -29 2
的测试用例时,我给出了一个输出,它可以正确地对数字进行排序并打印出3d
和test2
不是整数,但它会在开头放置两个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
答案 0 :(得分: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]);
}