1

我目前正在使用文件名,我需要获取不包括扩展名的名称。我有一个单独的函数来确定文件的扩展名,但找不到如何在没有扩展名的情况下获取名称的方法。

如果我有文件名 mylog.txt 我只想能够得到 mylog

我试过以下

strncpy(fileNameWithoutExt, LogRotateConfiguration->logFileName,
    strlen(LogRotateConfiguration->logFileName-strlen(fileExtension)-1));

但是由于某种原因,当我运行它时,我只得到m文件名的其余部分而不是其余部分。我永远不会知道文件名或扩展名中有很多字符,因此需要确定它需要获取哪个部分。

所以基本上,我将如何获得没有扩展名的文件名的问题。

感谢您的任何帮助,您可以提供。

4

3 回答 3

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.

于 2012-06-15T14:05:31.040 回答
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);

在寻找错误时简化代码。

于 2012-06-15T14:06:08.847 回答
0

你应该改变这个:

strlen(LogRotateConfiguration->logFileName-strlen(fileExtension)-1)

对此:

(strlen(LogRotateConfiguration->logFileName)) - (strlen(fileExtension)-1)

在这里,您首先获取完整strlen的文件名,然后减去strlen文件扩展名的,而不是获取strlenlogfilename-strlen(fileextension) 的。

于 2012-06-15T14:06:24.377 回答