在C中,按字符串长度排序字符串数组

Kne*_*ell 3 c arrays string-length

所以我将字符串输入到数组中 mydata[10][81]

while ((ct<=10) && gets(mydata[ct]) != NULL && (mydata[ct++][0] != '\0'))
Run Code Online (Sandbox Code Playgroud)

然后我使用for循环创建第二个指针数组

for (i=0;i<11;i++){
    ptstr[i] = mydata[i];
}
Run Code Online (Sandbox Code Playgroud)

这是我卡住的地方我知道我需要以strlen某种方式使用,但我甚至无法想到如何获得指针的长度然后根据第三个额外的长度值重新指定该指针的新位置

希望这是有道理的,我很失落如何做或解释它,我只是尝试使用数组位置(不使用类似的东西qsort)按长度排序字符串

我做了一些更多的工作并提出了这个:任何想法为什么它不起作用?

void orderLength(char *ptstr[], int num){
int temp;
char *tempptr;
int lengthArray[10];
int length = num;
int step, i, j, u;
for (i=0; i<num;i++){
    lengthArray[i] = strlen(ptstr[i]);
}
for (step=0; step < length; step++){
    for(j = step+1; j < step; j++){
          if (lengthArray[j] < lengthArray[step]){
              temp = lengthArray[j];
              lengthArray[j] = lengthArray[step];
              lengthArray[step] =temp;
              tempptr=ptstr[j];
              ptstr[j]=ptstr[step];

              }
          }
    }
    for (u=0; u<num; u++){
        printf("%s \n", ptstr[u]);
        }    
} 
Run Code Online (Sandbox Code Playgroud)

Nit*_*Nit 5

正如Deduplicator的评论中所建议的,使用qsort定义于stdlib.h.

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

#define ROWS 4
#define MAXLEN 20

int compare (const void * a, const void * b) {
    size_t fa = strlen((const char *)a);
    size_t fb = strlen((const char *)b);
    return (fa > fb) - (fa < fb);
}

int main(int argc, const char * argv[]) {
    char arr[ROWS][MAXLEN] = {
        "watfi",
        "wh",
        "barified",
        "foo"
    };
    qsort(arr, ROWS, MAXLEN, compare);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 我相信我知道一个可能的理由使用`(fa> fb) - (fa <fb)`而不是`fa - fb`,如果表达式'fa - fb`导致数字下溢或溢出.所以在一个32位的世界中,假设`fa`是'2 ^ 31 - 1`并且`fb`是负的`2 ^ 31 - 1`然后`fa - fb`是`2 ^ 32 - 2`这是一个即使`fa`大于`fb`也是负面结果.所以我可能要收回我所说的关于简化`return`表达式的内容! (2认同)
  • 我刚刚学到了一些东西,以前从未见过这样的回报! (2认同)