gpt4 book ai didi

C : using strlen for string including\0

转载 作者:太空宇宙 更新时间:2023-11-04 07:23:57 27 4
gpt4 key购买 nike

我需要做的是当给定一个文本或字符串时

\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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com