【问题标题】:Sorting argv Inserts Random Numbers排序 argv 插入随机数
【发布时间】:2018-02-16 16:38:12
【问题描述】:

我正在尝试对 *argv[] 进行排序,当我尝试显示排序结果时,我会打印出随机数。

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

void sortIntegers(int value[], int length);
int convertToInt(char *string);
int *sortArguments(int argc, char *argv[]);

int main() {

    int i;
    int value[9] = {0, 234, 345345, 91, -3, 12, 3, 19, 17};
    char *argv[9] = {"0", "234", "345345", "91", "-3", "12", "3", "19", "17"};
    int argc = 9;
    int *result;

    printf("\n");

/* order before sorting */
    printf("Before: ");
    for(i = 0; i < 9; i++){
        printf("%d ", value[i]);
    } 
/* end or sorting proof */

/* converting char sting to integers and sorting */
    result =sortArguments(argc, argv);
    printf("\nAfter: ");
    for (i = 0; i < argc; i++) {
        printf("%d, ", result[i]);
    }
    printf("\n");
/* end of sorting and conversion */

/* this is to prove my sort algorith works */
    sortIntegers(value, 9);
    printf("Desired Results: ");
    for(i = 0; i < 9; i++){
        printf("%d ", value[i]);
    }
    printf("\n\n");
/* end or sorting proof */

    free(result);
    return 0;
}

 void sortIntegers(int value[], int length) {     

    int i;
    int x;
    int temp;

    for(x = 0; x < (length - 1); x++)
    {
        for(i = 0; i < (length - x -1); i++)
        {
            if(value[i] > value[i+1])
            {
                temp = value[i];
                value[i] = value[i + 1];
                value[i + 1] = temp;
            }
        }
    }
}
int convertToInt(const char *string) {
    char stringToNum;

    stringToNum = atoi(string);

    return stringToNum;
}
int *sortArguments(int argc, char *argv[]) {

    int *list = malloc(sizeof(int) * (argc));
    int i;    

    for (i = 0; i < argc; i++) 
    {    
        list[i] = convertToInt(argv[i]);
    }
    sortIntegers(list, (argc));

    return list;
}

我已经查看了Bubble sorting random numbers 的问题,并且我相信我没有犯此错误。

这是我的程序的输出: Before: 0 234 345345 91 -3 12 3 19 17 After: -22, -3, 0, 1, 3, 12, 17, 19, Desired Results: -3 0 3 12 17 19 91 234 345345

before 语句来自我的 main 中的排序测试,这是正确完成的,因此我相信我的问题是指针工作或调用函数。

有人知道为什么排序会插入随机数吗?

【问题讨论】:

  • 您是否使用调试器跟踪代码以查看变量在程序中每个点的值?用笔和纸跟踪调试器,并检查代码何时以您未曾预料到的方式首次更改数字,这样您就可以将问题隔离到一两行而不是整个程序。
  • @DavyM 我已经做到了,我一定错过了什么,我现在要再做一次
  • convertToInt 没用而且错了。直接使用atoi即可。
  • int *list = malloc(sizeof(int) * (argc-1)); 是错误的。应该是sizeof(int) * argc
  • @IngoLeonhardt 我已经改了,谢谢

标签: c sorting


【解决方案1】:

不要在convertToInt中使用char,使用int

int convertToInt(char *string) {
    int stringToNum;

    stringToNum = atoi(string);

    return stringToNum;
}

甚至更好

int convertToInt(char *string) {
    return atoi(string);
}

或者更好的是,将函数调用全部去掉,直接在sortArguments() 中使用atoi()(正如Michael 所建议的那样)

int *sortArguments(int argc, char *argv[]) {

    int *list = malloc(sizeof(int) * (argc));
    int i;    

    for (i = 0; i < argc; i++) 
    {    
        list[i] = atoi(argv[i]);
    }
    sortIntegers(list, (argc));

    return list;
}

【讨论】:

  • 您可能想了解为什么,例如 234、345345 不适合签名字符。
  • 确实,sizeof(char) = 1 byte,signed 给你 7 bits 的正值,2^7 =128,给你一个 0 到 127 的范围
  • @StephenDocy 这就是排序后数组中会出现-22之类的数字的原因,345345太大而无法存储到char中。就因为这样,电脑就组成了随机数?
  • 这就是你得到-22的原因,但它不仅仅是一个随机数。当值超出正值范围时,它设置符号位,将其变为负值....google“整数溢出”
  • @TylerGreen 看看 Ingo Leonhardt 对您的回答的评论。这是至关重要的,如果没有更正他建议您的程序具有未定义的行为(谷歌)。
猜你喜欢
  • 2021-06-10
  • 2012-08-21
  • 2011-11-28
  • 1970-01-01
  • 2015-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-21
相关资源
最近更新 更多