C : using strlen for string including\0

标签 c pointers

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

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

相关文章:

c - 局部变量前的 GOTO

c - getopt_long() 将多个参数解析为单个选项字母

c++ - glVertexAttribPointer 设置为指针

c - 如何使用C反转字符串?

c - 如何编译APRON的例子?

c - 数组的所有元素中都存储相同的字符串

c++ - 指针初始化

对字符串文字 char *p = "abcd"执行++*(p++) 时出现 C 运行时错误(未定义行为)

c - gdb 目标远程 :1234 connection timeout linux

c - 了解二维数组中行的 c 指针