首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >以更自然的方式对字符串进行排序的C程序

以更自然的方式对字符串进行排序的C程序
EN

Stack Overflow用户
提问于 2020-04-04 19:02:10
回答 1查看 44关注 0票数 1

我正在尝试编写一个以自然的方式对字符串进行排序的脚本。这在以下情况下工作正常:

代码语言:javascript
复制
Input:
something something1 something10 10
Result:
10 something something1 something10

但是,如果我尝试对以下内容进行排序:

代码语言:javascript
复制
Input:
something8b something8a something1 something15

脚本一直排序到第一个数字,我得到的结果如下:

代码语言:javascript
复制
Result:
something1 something8b something8a something15

但我想要的结果是:

代码语言:javascript
复制
something1 something8a something8b something15

我正在尝试的代码如下:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int naturalstrcmp(const char **s1, const char **s2);
int main(int argc, char **argv){

  qsort(&argv[1],argc-1,sizeof(char*),
    (int(*)(const void *, const void *))naturalstrcmp);
  while(--argc){
    printf("%s ",(++argv)[0]);
  };
  printf("\n");
}
int naturalstrcmp(const char **s1p, const char **s2p){
  if ((NULL == s1p) || (NULL == *s1p)) {
    if ((NULL == s2p) || (NULL == *s2p)) return 0;
    return 1;
  };
  if ((NULL == s2p) || (NULL == *s2p)) return -1;

  const char *s1=*s1p;
  const char *s2=*s2p;

  do {
    if (isdigit(s1[0]) && isdigit(s2[0])){ 
      int c1 = strspn(s1,"0123456789"); 
      int c2 = strspn(s2,"0123456789");
      if (c1 > c2) {
    return 1;
      } else if (c1 < c2) {
    return -1;
      };

      while (c1--) {
    if (s1[0] > s2[0]){
      return 1;
    } else if (s1[0] < s2[0]){
      return -1;
    }; 
    s1++;
    s2++;
      };
    } else if (s1[0] > s2[0]){
      return 1;
    } else if (s1[0] < s2[0]){
      return -1;
    }; 
    s1++;
    s2++;
  } while ( (*s1!='\0') || (*s2!='\0') );
}```
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-04 19:12:40

由于您将递增两次s1和s2,因此在比较数字时,如果存在匹配,则跳过数字后面的下一个字符。在else语句中执行最后一个增量。

代码语言:javascript
复制
   if (digit...)
      ...
      while (c1--) {
        if (s1[0] > s2[0]){
          return 1;
        } else if (s1[0] < s2[0]){
          return -1;
        }; 
        s1++;
        s2++;
      };
    else if(...) {
    }
    else { 
       s1++;
       s2++;
    }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61027100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档