我目前正在使用文件名,我需要获取不包含扩展名的名称。我有一个单独的函数来确定文件的扩展名,但无法找到如何在没有扩展名的情况下获取名称的方法。
如果我有文件名mylog.txt我只想要出来mylog
我试过以下
strncpy(fileNameWithoutExt, LogRotateConfiguration->logFileName,
strlen(LogRotateConfiguration->logFileName-strlen(fileExtension)-1));
出于某种原因,当我运行这个时,我只得到m
而不是文件名的其余部分。我永远不会知道文件名或扩展名中有很多字符,所以需要弄清楚它需要得到的部分。
基本上,问题是如何在没有扩展名的情况下获取文件的名称。
感谢您提供的任何帮助。
答案 0 :(得分:1)
咦?
您是否认真地从传递到 strlen()
的指针中减去扩展名的长度?这似乎很危险而且很奇怪。
此外,你不应该使用strncpy()
,除非你真的需要它是相当古怪的语义。您可能没有,并且使用它来复制较长字符串的一部分是一种非常好的失败方法。
更好的解决方案通常是计算长度,并使用memcpy()
:
char out[WHATEVER];
const size_t len = strlen(LogRotateConfiguration->logFileName);
const size_t elen = strlen(fileExtension);
const size_t out_len = len - elen;
if( out_len < sizeof out )
{
memcpy(out, LogRotateConfiguration->logFileName, out_len);
out[out_len] = '\0';
}
else
out[0] = '\0'; /* Make sure we get an empty output if filename won't fit. */
请注意,这也适用于const
,并将strlen()
的返回值存储在正确类型的变量中,即size_t
。
答案 1 :(得分:1)
在你的代码中,你在logFileName字符串之前计算的内存区域的strlen。
似乎len不正确;
strncpy(fileNameWithoutExt, LogRotateConfiguration->logFileName,
strlen(LogRotateConfiguration->logFileName)-strlen(fileExtension)-1);
^
但是下面的代码将更具可读性。
int logFileNameLen = strlen(LogRotateConfiguration->logFileName);
int extensionLen = strlen(fileExtension);
strncpy(fileNameWithoutExt, LogRotateConfiguration->logFileName,
logFileNameLen -extensionLen -1);
在查找错误时简化代码。
答案 2 :(得分:0)
你应该改变这个:
strlen(LogRotateConfiguration->logFileName-strlen(fileExtension)-1)
到此:
(strlen(LogRotateConfiguration->logFileName)) - (strlen(fileExtension)-1)
这里首先获得文件名的完整strlen
,然后减去文件扩展名的strlen
,而不是获取logfilename-strlen的strlen
(fileextension)。