Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检索符号链接的路径

检索符号链接的路径
EN

Stack Overflow用户
提问于 2014-09-12 13:14:41
回答 3查看 950关注 0票数 0

我想存储符号链接指向bufff的文件的路径。这适用于我使用readlink的当前实现,但它获取了我不需要的额外数据,因为bufsize的值是任意的。我不知道如何根据符号链接指向的路径来确定它的大小,因为我所拥有的只是指向符号链接的路径。它存储在path中,这是一个char数组。如果我所拥有的只是符号链接的路径,我如何知道如何使用链接的直接路径字符串的大小来确定bufff的大小?

代码语言:javascript
运行
AI代码解释
复制
char bufff[100];
size_t bufsize = 100;
readlink(path,bufff,bufsize);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-12 13:43:07

readlink()函数返回复制到缓冲区的字节数,而不返回最终的\0。这意味着,如果使用缓冲区为100字节的readlink()调用,而readlink()返回100字节,则需要更多的空间(即使路径正好是100个字节,在末尾添加空字符仍然需要至少一个字节)。

解决方案是在循环中增加缓冲区:

代码语言:javascript
运行
AI代码解释
复制
size_t bufsize = 255; /* Initial buffer size */
ssize_t result;
char* buf = malloc(bufsize); /* Initial buffer allocation */
while ((result = readlink(path, buf, bufsize)) >= bufsize) {
    /* We double the buffer size, so next call should succeed ! */
    bufsize *= 2;
    buf = realloc(buf, bufsize);
}
buf[result] = '\0';

警告:这只是一个例子,如果出现错误,我们不会检查readlink是否返回-1。mallocrealloc也是如此。你应该检查真实世界中的错误。

票数 2
EN

Stack Overflow用户

发布于 2014-09-12 13:19:12

readlink()返回路径的长度,它不会将尾部NUL放入缓冲区。你需要自己做:

代码语言:javascript
运行
AI代码解释
复制
size_t pathlength = readlink(path, bufff, sizeof(bufff)-1);
bufff[pathlength] = 0;

请注意,我从缓冲区的大小中减去1,以确保NUL有空间。

票数 2
EN

Stack Overflow用户

发布于 2016-03-07 14:14:11

一个基于Thibaut D.的回答的完整函数:

代码语言:javascript
运行
AI代码解释
复制
char *do_get_symlink(char *path, struct stat attr) {

  /*
   * a much more elegant solution would be to use realpath(),
   * but it is 35% slower and produces different results on /proc
   */

  if (S_ISLNK(attr.st_mode)) {
    /*
     * st_size appears to be an unreliable source of the link length
     * PATH_MAX is artificial and not used by the GNU C Library
     */
    ssize_t length;
    size_t buffer = 128;
    char *symlink = malloc(sizeof(char) * buffer);

    if (!symlink) {
      fprintf(stderr, "%s: malloc(): %s\n", program, strerror(errno));
      return strdup("");
    }

    /*
     * if readlink() fills the buffer, double it and run again
     * even if it equals, because we need a character for the termination
     */
    while ((length = readlink(path, symlink, buffer)) > 0 && (size_t)length >= buffer) {
      buffer *= 2;
      symlink = realloc(symlink, buffer);

      if (!symlink) {
        fprintf(stderr, "%s: realloc(): %s\n", program, strerror(errno));
        return strdup("");
      }
    }

    if (length < 0) {
      fprintf(stderr, "%s: readlink(%s): %s\n", program, path, strerror(errno));
      free(symlink);
      return strdup("");
    }

    symlink[length] = '\0';
    return symlink;
  }

  /*
   * the entry is not a symlink
   * strdup is needed to keep the output free-able
   */
  return strdup("");
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25816944

复制
相关文章
shell 字符串操作 ${} 的截取,删除,和 替换
字符串截取 字符长度 [user@host dir]$ str=123abc123 [user@host dir]$ echo ${#str} 9 从左边截取 ${string:position:length} :从字符串 string 的 position 位置截取 length 个字符串 [user@host dir]$ str=123abc123 [user@host dir]$ echo ${str:3:3} abc [user@host dir]$ echo "${str:0:${
solve
2019/10/30
8.2K1
在 Python 中的常见的几种字符串替换操作
比如,输入的字符串为’one two one two one’,第一个参数为替换前的参数,第二个为替换后的参数。默认会替换字符串中的所有符合条件的字符串。
全栈程序员站长
2022/09/07
6.4K0
java字符串操作:如何实现字符串的反转及替换?
可用字符串构造一 StringBuffer 对象,然后调用 StringBuffer 中的 reverse
MickyInvQ
2020/09/27
1.3K0
mongodb 字符串查找匹配中$regex的用法
官网地址:https://docs.mongodb.com/manual/reference/operator/query/regex/#regex-case-insensitive
庞小明
2018/12/10
6.3K0
【Kotlin】字符串操作 ② ( 字符串替换函数 replace | 字符串比较操作符 == 和 === | 字符串遍历 forEach )
对应代码中的 Regex("[ol]") , 该正则表达式的含义是 单个字符 o 或者 l ;
韩曙亮
2023/03/30
1.7K0
【Kotlin】字符串操作 ② ( 字符串替换函数 replace | 字符串比较操作符 == 和 === | 字符串遍历 forEach )
C++实现字符串的分割和替换
代码主要说明: (1)tmp.find(target):查找子串第一次出现的下标; (2)string::npos:表示未查找到子串时返回的数值。MSDN中规定,其值定义如下:static const size_type npos = -1;,转换为无符号整型unsignned int表示的是string所能容纳的最大字符数。 (3)string::size_type (由字符串配置器 allocator 定义) 描述的是 string的size,故需为无符号整数型别。因为字符串配置器缺省以类型size_t 作为 size_type。
恋喵大鲤鱼
2019/02/22
2.9K0
C++实现字符串的分割和替换
代码主要说明: (1)tmp.find(target):查找子串第一次出现的下标; (2)string::npos:表示未查找到子串时返回的数值。MSDN中规定,其值定义如下:static const size_type npos = -1;,转换为无符号整型unsignned int表示的是string所能容纳的最大字符数。 (3)string::size_type (由字符串配置器 allocator 定义) 描述的是 string的size,故需为无符号整数型别。因为字符串配置器缺省以类型size_t 作为 size_type。
恋喵大鲤鱼
2018/08/03
9310
字符串内容的替换
字符串string类有成员函数replace() string str; string s1; str.replace(pos,len,s1);//使用s1的长度为len,从str的pos位置开始替换 str.replace(pos,len,s1,pos1,len1);//使用s1的子串从pos1开始长度为len1。替换str中从pos开始长度为len的长度
杨鹏伟
2021/06/17
3.1K0
Pandas中高效的选择和替换操作总结
作为数据科学家,使用正确的工具和技术来最大限度地利用数据是很重要的。Pandas是数据操作、分析和可视化的重要工具,有效地使用Pandas可能具有挑战性,从使用向量化操作到利用内置函数,这些最佳实践可以帮助数据科学家使用Pandas快速准确地分析和可视化数据。
deephub
2023/02/01
1.3K0
Python 字符串操作(截取/替换/查找/分割)
截取字符串使用 变量[头下标:尾下标],就可以截取相应的字符串,其中下标是从0开始算起,可以是正数或负数,下标可以为空表示取到头或尾。
IT工作者
2022/07/07
2.8K0
js替换html中的字符串,js怎么替换字符串?
在js中,可以使用str.replace()方法来替换字符串。replace()方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串;然后返回一个新的字符串。
全栈程序员站长
2022/08/30
24.1K0
js替换html中的字符串,js怎么替换字符串?
Makefile中的字符串替换
Makefile Tutotial最后给出了一段makefile,里面OBJS有字符串通配、替换的过程:
mingjie
2023/10/13
7170
删除字符串中的子串(C++ regex求解)
输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2。
喜欢ctrl的cxk
2019/11/07
3.5K0
字符串替换
每行数据是一个字符串,长度不超过1000  数据以EOF结束输出对于输入的每一行,输出替换后的字符串样例输入
书童小二
2018/09/03
3K0
Java中替换字符串的方法
1. replace的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替换(CharSequence即字符串序列的意思,说白了就是字符串的意思)。
bisal
2021/10/15
5.9K0
字符串中符号的替换---replace的用法
1 #include<iostream> 2 #include<string> 3 4 using namespace std; 5 6 int main() 7 { 8 string s1 = "one*two*three";//Given String 9 string s2 = "*";//delimeter 10 string s3 = ",";//string to replace 11
猿人谷
2018/01/17
3.8K0
字符串中符号的替换---replace的用法
Java基础入门之字符串的转换、替换、删除和判断
1.在开发过程中,有时需要对字符串的转换操作,例如字符串的字母大小写转换把”abc”转换成”ABC”,基本数据类型转换成字符串、字符数组转换成字符串,字符串转成数组的形式等。
Java进阶者
2021/03/29
9850
php 字符串替换中文,PHP中文字符串替换其中为*的方法
在项目中需要对字符串的部分进行隐藏或者替换。譬如手机号码的中间几位进行隐藏,中文名字的中间替换为*号等。
全栈程序员站长
2022/08/25
8K0
基于PHP中自带的字符串操作函数合集
strpos($str,search,[int])://查找search在$str中的第一次位置从int开始; strrpos($str,search,[int])://查找search在$str中的最后一次出现的位置从int开始
用户2323866
2021/07/01
6500
点击加载更多

相似问题

基于Regex的字符串替换操作不起作用

10

字符串操作/regex-查找和替换

11

基于Java Regex的字符串替换

22

基于位置替换字符串部分的Regex

46

Python -基于regex检索和替换

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档