c - 以更自然的方式对字符串进行排序的 C 程序
问题描述
我正在尝试编写一个以自然方式对字符串进行排序的脚本。这适用于:
Input:
something something1 something10 10
Result:
10 something something1 something10
但是,如果我尝试对以下内容进行排序:
Input:
something8b something8a something1 something15
该脚本正在排序直到第一个数字,我得到以下结果:
Result:
something1 something8b something8a something15
但我想要的结果是:
something1 something8a something8b something15
我正在尝试的代码如下:
#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') );
}```
解决方案
因为您将 s1 和 s2 递增两次,如果匹配,则在比较数字时,您将跳过数字后面的下一个字符。在 else 语句中执行最后一个增量。
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++;
}
推荐阅读
- javascript - 标识符的正则表达式
- c# - .NET CLI:dotnet pack 命令在正确的文件夹中不起作用,并且当 .csproj 存在时
- python - 如何让我的程序同时执行多个功能
- mysql - Amazon Rds MySql:添加只读副本与升级数据库实例类
- visual-studio-code - 为什么在输入片段期间按 Tab 时我的 vscode 太慢
- vue-cli-3 - 如何将动态创建的 env var (vuecli-3) 传递给 npm run?
- docusaurus - docusaurus v2 中的根组件 swizzle 不起作用
- android - Apple M1 上的 Android Studio ArcticFox 继续使用 Intel arch
- branch.io - 无法访问 Branch.io 上的快速链接报告数据
- jib - Google jib - 更改所有文件和文件夹的所有者