【发布时间】:2011-01-10 19:33:17
【问题描述】:
我有像“folder1/file1.txt”或“foldername1/hello.txt”这样的字符串,我需要使用包含斜杠(/)标识文件夹名称的子字符串
(例如:来自“folder1 /file1.txt”我需要“文件夹 1/”)。
文件夹名称的长度不同。
我怎么能在C中做到这一点?谢谢
【问题讨论】:
我有像“folder1/file1.txt”或“foldername1/hello.txt”这样的字符串,我需要使用包含斜杠(/)标识文件夹名称的子字符串
(例如:来自“folder1 /file1.txt”我需要“文件夹 1/”)。
文件夹名称的长度不同。
我怎么能在C中做到这一点?谢谢
【问题讨论】:
首先,用strchr找到斜线的位置:
char * f = "folder/foo.txt"; // or whatever
char * pos = strchr( f, '/' );
然后复制到合适的地方:
char path[1000]; // or whatever
strncpy( path, f, (pos - f) + 1 );
path[(pos-f)+1] = 0; // null terminate
你真的应该写一个函数来做这个,你需要决定如果strchr()返回NULL,表明斜线不存在怎么办。
【讨论】:
找到最后一个'/'字符,前进一个字符然后截断字符串。假设字符串是可修改的,并且被char *filename;指向:
char *p;
p = strrchr(filename, '/');
if (p)
{
p[1] = '\0';
}
/* filename now points to just the path */
【讨论】:
你可以使用 strstr() 函数:
char *s = "folder1/file1.txt";
char folder[100];
char *p = strstr(s, "/");
if (0 != p)
{
int len = p - s + 1;
strncpy(folder, s, len);
folder[len] = '\0';
puts(folder);
}
【讨论】:
如果您在 POSIX 机器上工作,您可以查找 dirname() 函数,它或多或少可以满足您的需求。有一些特殊情况,它处理的幼稚代码没有处理 - 但也要注意标准中的黄鼠狼字(关于修改输入字符串,可能返回一个指向输入字符串的指针,或者可能是一个指向可以修改的静态内存的指针稍后)。
它 (dirname()) 不会保留您说需要的尾部斜杠。然而,这很少是一个实际问题。在目录名和文件之间添加斜线并不难。
【讨论】: