【问题标题】:Advancing one character past strrchr in C在 C 中将一个字符推进到 strrchr
【发布时间】:2015-01-27 17:18:12
【问题描述】:

我觉得这应该是一件容易的事,但我不断收到分段错误错误。我正在尝试查找最后一次出现的字符“/”,然后在该字符之后打印一个。

这主要是为了打印出一个文件,这样:

directory1/directory2/hello.txt

应该像这样打印出来:

hello.txt

我正在尝试使用 strrchr 来执行此操作,但由于它返回一个字符的最后一次出现,它会打印出以下内容:

/hello.txt

我以为我可以将字符指针前移一个斜线,然后打印它,但是这样做会出现段错误:

void print_path(char *dir_name)
{
    char *c_ptr = strrchr(dir_name, '/');
    *c_ptr = *c_ptr + 1;
    printf("%s\n", c_ptr);
}

我也环顾四周,尝试使用一种方法,将c_ptr 复制到临时变量,将一个添加到新的临时字符串,然后在末尾添加一个空字符,但这也导致了错误。

我该怎么办?

【问题讨论】:

  • 代码可以使用函数'basename'来获取指向整个字符串文件名部分的指针。
  • OT:你的名字很有误导性。该函数暗示打印路径,但它实际上打印文件名。该参数暗示了一个目录名称,但显然它需要传入一个完整的路径。

标签: c string


【解决方案1】:

你应该做指针运算,这是错误的:

*c_ptr = *c_ptr + 1; // incorrect

应该是

c_ptr = c_ptr + 1;

c_ptr++;

c_ptr += 1;

*c_ptr = *c_ptr + 1 中,您正在取消引用指针并添加到字符串开头的前一个值1

strrchr 之后的c_ptr 将指向'/' 字符,即*c_ptr == '/' 所以

*c_ptr = *c_ptr + 1;

等价于

c_ptr[0] = c_ptr[0] + 1;

c_ptr[0] = '/' + 1;

之后,c_ptr[0] 包含字符 '0',因此 printf() 必须打印 0hello.txt

如果在源字符串中没有找到子字符串,strrchr() 将返回NULL,所以你也应该检查一下。

你的程序的固定版本是

void print_path(char *dir_name)
{
    char *c_ptr = strrchr(dir_name, '/');
    if (c_ptr != NULL)
    {
        c_ptr = c_ptr + 1;
        printf("%s\n", c_ptr);
    }
}

【讨论】:

  • 而且你应该只在c_ptr != NULL 时这样做,以防根本没有分隔符。
【解决方案2】:

问题出在这一行:

*c_ptr = *c_ptr + 1;

您正在取消引用 c_ptr。这意味着您将获得'/' + 1 的价值,无论它是什么。你想要这个:

void print_path(char *dir_name)
{
    char *c_ptr = strrchr(dir_name, '/');
    c_ptr = c_ptr + 1;
    printf("%s\n", c_ptr);
}

【讨论】:

    猜你喜欢
    • 2011-06-21
    • 2021-01-10
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    相关资源
    最近更新 更多