【问题标题】:An alphanumeric sorting algorithm with scanf c使用 scanf c 的字母数字排序算法
【发布时间】:2020-07-06 11:25:15
【问题描述】:

我创建了一个程序,可以按字母数字顺序对数组中的字符串进行排序。

但我的问题是如何做到这一点,以便在您运行程序时,它会询问字符串(使用scanf,但问题是如何使用char const *array?)然后程序排序并创建一个将保存结果的新文件。

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

FILE *myFile = NULL;
static void consoleWrite(char const **a, size_t b) {
    size_t i;
    for (i = 0; i < b; i++)
        fprintf(myFile, "%s ", a[i]);
    printf("\n");
}

static int string_cmp(void const *i, void const *j) {
    char const *const *pointerI = i;
    char const *const *pointerJ = j;   
    return strcmp(*pointerJ, *pointerI); // comparaison de la chaine de caractère !
}

int main(void) {
    char const *array[] = { 
        "01", "fdf", "gffg", "FRSTM-PFOV1DK", "FRSTM-KEFF2OQHT"
    };

    myFile = fopen("file.ini", "a+");
    long array_size = sizeof array / sizeof *array;

    qsort(array, array_size, sizeof *array, string_cmp);
    consoleWrite(array, array_size);
    printf("Le tri a été effectué ! ");

    return 0;
}

我想将我的数据保存在变量数组中,然后用这个变量进行排序。

【问题讨论】:

  • OT: about: fprintf (myFile, "%s ", a[i]); 建议在格式字符串中附加一个 '\n',这样数组中的每个项目都在输出文件中的单独一行上。
  • OT:关于:`myFile =fopen("file.ini", "a+");` 始终检查 (!=NULL) 返回值以确保操作成功。如果不成功,则调用perror( "your error message" ); exit( EXIT_FAILURE ); 注意:exit()EXIT_FAILURE 通过头文件暴露:stdlib.h
  • 关于:myFile =fopen("file.ini", "a+"); 为什么+ 在文件从不被读取的模式下?模式中的a 表示每次运行程序时文件都会变大。这就是你想要的吗?
  • 您是否意识到文件正在按降序排序(由于对strcmp()的调用中的参数顺序?
  • 关于语句:printf ("\n"); 您是否意识到printf() 语句的输出将进入您的终端,而不是正在生成的文件。这是你想要的吗?

标签: c arrays pointers scanf quicksort


【解决方案1】:

您可以为此动态分配内存。首先询问用户将输入的字符串数量,然后分配该大小的char* 数组。然后读入字符串,将其保存为缓冲区,为输入的字符串分配足够的内存并将缓冲区内容复制到其中。像这样

int main(void) {
  int array_size = 0;
  char **array;
  char buffer[256];

  myFile = fopen("file.ini", "a+");

  scanf("%d", &array_size);
  array = malloc(array_size * sizeof(char*));

  for(int i = 0; i < array_size; i++) {
    scanf("%s", buffer);
    array[i] = malloc(strlen(buffer) + 1);
    strncpy(array[i], buffer, strlen(buffer) + 1);
  }

  qsort(array, array_size, sizeof *array, string_cmp);
  consoleWrite(array, array_size);
  printf("Le tri a été effectué ! ");

  for(int i = 0; i < array_size; i++)
    free(array[i]);
  free(array);

  return 0;
}

【讨论】:

  • 您应该使用scanf("%249s", buffer); 防止潜在的未定义行为并测试scanf()malloc() 的返回值。
  • strncpy(array[i], buffer, strlen(buffer) + 1); 产生与strcpy(array[i], buffer); 相同的结果。 不要使用strncpy,它的语义被广泛误解并且容易出错。
猜你喜欢
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 2017-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-20
  • 2015-06-22
相关资源
最近更新 更多