我需要做的是当给定一个文本或字符串时
\0abc\n\0Def\n\0Heel\n\0Jijer\n\tlkjer
我需要使用 qsort 并根据 rot 编码比较对这个字符串进行排序。
int my_rot_conv(int c) {
if ('a' <= tolower(c) && tolower(c) <= 'z')
return tolower(c)+13 <= 'z' ? c+13 : c-13;
return c;
}
int my_rot_comparison(const void *a, const void *b) {
char* ia = (char*) a;
char* ib = (char*) b;
int i=0;
ia++, ib++;
while (i<strlen(ia)) {
if (ia[i] == '\0' || ia[i] == '\n' || ia[i] == '\t' || ib[i] == '\0' || ib[i] == '\n' || ib[i] == '\t') {
i++;
}
if (my_rot_conv(ia[i]) > my_rot_conv(ib[i])) {
return 1;
} else if (my_rot_conv(ia[i]) < my_rot_conv(ib[i]))
return -1;
}
return 0;
}
我开始比较两个以\0 开头的字符串,在下面的示例中得到 -1。
printf("%d \n", my_rot_comparison("\0Abbsdf\n", "\0Csdf\n"));
但这不适用于带有 qsort 的字符串,因为 ia++, ib++;
只适用于一个单词的比较。
char *my_arr;
my_arr = malloc(sizeof(\0abc\n\0Def\n\0Heel\n\0Jijer\n\tlkjer));
strcpy(my_arr, \0abc\n\0Def\n\0Heel\n\0Jijer\n\tlkjer);
qsort(my_arr, sizeof(my_arr), sizeof(char), my_rot_comparison);
并且数组应该像 \0Def\n\0Heel\n\0Jijer\n\0\n\tlkjer
一样排序
我的问题是如何定义适用于包含 \0
和 \t
以及 \n
字符的字符串的比较函数?
最佳答案
strlen
根本无法对嵌入 \0
字节的字符串进行正确操作,因为根据函数的定义 strlen
认为字符串的结尾是在字符串开头或之后遇到的第一个 \0
字节。
其余的标准 C 字符串函数以相同的方式定义。
这意味着您必须使用一组不同的函数来操作可能包含 \0
字节的字符串(类)数据。您可能必须自己编写这些函数。
请注意,您可能必须定义一个包含 length
成员的结构,因为您将无法依赖特定的标记字节(例如 \0
) 来标记字符串的结尾。例如:
typedef struct {
unsigned int length;
char bytes[];
}
MyString;
如果在您的输入字符串中有一些其他字节(\0
除外)是被禁止的,那么(根据评论者@Sinn)您可以交换它并且\0
,然后使用普通的 C 字符串函数。但是,尚不清楚这是否适合您。
关于C : using strlen for string including\0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19696346/