我正在try 编写一个Trim函数,但当我try 使用它时,编译器给我一个运行时错误或load of null pointer of type 'char',而我试图运行以下代码:

// Trim trailing whitespace
int len = strlen(*str);
int trimmed = 0;

while (isspace(*str[len - 1])) {
    --len;
    trimmed = 1;
}

以下是我的编译器命令:gcc ./main.c ./json.c -g -m64 -Wall -Wextra -fsanitize=address,undefined,leak -I ./lib/include -L ./lib -o ./json

以下是导致错误的函数:

void _JSON_Trim(char **str) {
  // Trim leading whitespace
  while (isspace(**str) || **str == '\0') {
    ++*str;
  }

  // Trim trailing whitespace
  int len = strlen(*str);
  int trimmed = 0;

  while (isspace(*str[len - 1])) {
    --len;
    trimmed = 1;
  }

  if (trimmed) {
    *str[len] = '\0';
  }
}

在我添加双指针符号(char **strchar *str)之前,这段代码一直处于半工作状态.然而,char *str没有正确地递增指针.

注意:错误特别出现在调用while (isspace(*str[len - 1])) {的第11行.我不知道它出现在行的什么位置,因为编译器没有指定.

这是对其调用函数的字符串:

[
    "HI",
    "Bye"
]

注:是的,我知道这里没有什么技术上的修剪,所以函数不会做任何事情,但它在那里的情况下,它做了

推荐答案

后缀下标运算符的优先级高于一元取消引用运算符.这条线

while (isspace(*str[len - 1])) {

相当于

while (isspace(*( str[len - 1] ))) {

当你需要写的时候

while (isspace( ( *str )[len - 1])) {

写出来就更好了

while (isspace( ( unsigned char )( *str )[len - 1])) {

注意变量len的类型应该是size_t而不是int

int len = strlen(*str);.

size_t是函数strlen的返回类型.

C++相关问答推荐

C sscanf没有捕获第二个参数

如何避免重新分配指针数组时,我们从一开始就不知道确切的大小

GCC:try 使用—WError或—pedantic using pragmas

如何使用Python C API实现多线程程序?

正确的TCP/IP数据包 struct

当输入负数时,排序算法存在问题

Make Node函数.S有什么问题吗?

错误:包含文件时类型名称未知

C中的FREE函数正在触发断点

在txt文件中找到指定的字符串,并从数字中减go 相同的值

错误...的多个定义(&Q)首先在这里定义&

基于蝶数恰好有8个除数的事实的代码

意外的C并集结果

为什么这个代码的最后一次迭代不能正常工作?

将char*铸造为空**

在列表中查找素数

为什么INT_MIN是在c语言的头文件limits.h中定义的(-INT_MAX-1)而不是直接使用-2147483648

当 a 是代码块时使用逗号运算符 (a, b)

c 函数指针,另一种语法

c中数组上显示的随机元素