首页 > 解决方案 > 无法正确排序字符串数组

问题描述

假设我有两个数组,其中一个包含某些数字,另一个包含与这些数字对应的名称,其方式sums[i]names[i].

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

int main()
{
  char *names[] = {"William","Olivia","Willaim","Olivai","Lily","Lyli"};
  int sums[6] = {58, 48, 58, 48, 30, 30};
  int i, j, s = 6;
  char *temp_char;
  int temp_int;
  for(i=0 ; i < s-1 ; i++){
    for (j=0; j<s-i; j++){
      if (sums[j]<sums[j+1]){
        temp_char = names[j+1];
        temp_int = sums[j+1];
        names[j+1] = names[j];
        sums[j+1] = sums[j];
        names[j] = temp_char;
        sums[j] = temp_int;
      }

      if ((sums[j] == sums[j+1]) && (strcmp(names[j], names[j+i])>0)) {
        temp_char = names[j+1];
        names[j+1] = names[j];
        names[j] = temp_char;
      }
    }
  }

  for (i = 0; i<s; i++){
    printf("%d ", sums[i]);
    printf("%s\n", names[i]);
  }

  return 0;
}

这是原始代码的一部分,经过编译但没有真正正确排序。然而,这个突然返回分段错误。

为什么我突然收到此错误,为什么排序不起作用?

标签: csortingc-strings

解决方案


解决方案:

由于变量 j可能会越过索引范围,因此您会收到错误消息。

所以,你应该检查j < si-1; 在内循环中。我还使用isSwapped布尔变量优化了您的代码。

代码:

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

int main()
{

  char *names[] = {"William","Olivia","Willaim","Olivai","Lily","Lyli"};
  int sums[6] = {58, 48, 58, 48, 30, 30};
  int i, j, s = 6;
  char *temp_char;
  int temp_int;
  bool isSwapped; // for optimization
  for(i=0 ; i < s ; i++){
    isSwapped = false;
    for (j=0; j<s-i-1; j++) { 
      // Sort by sum
      if (sums[j]<sums[j+1]){
          temp_char = names[j+1]; temp_int = sums[j+1];
          names[j+1] = names[j]; sums[j+1] = sums[j];
          names[j] = temp_char; sums[j] = temp_int;
          isSwapped = true;
      }
      // Sort by name (only if values of sum is same)
      else if ((sums[j] == sums[j+1]) && (strcmp(names[j+1], names[j])>0)) {
          temp_char = names[j+1];
          names[j+1] = names[j];
          names[j] = temp_char;
          isSwapped = true;
      }
    }
    if (!isSwapped) break;
  }

  for (i = 0; i<s; i++){
    printf("%d ", sums[i]);
    printf("%s\n", names[i]);
  }

  return 0;
}

推荐阅读