【问题标题】:Getting a string to a certain length.获取一定长度的字符串。
【发布时间】:2012-06-15 14:01:59
【问题描述】:

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

如果我有文件名 mylog.txt,我只想能够取出 mylog

我已经尝试了以下

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

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

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

感谢您提供的任何帮助。

【问题讨论】:

  • 注意你的括号。你不是说strlen(LogRotateConfiguration->logFileName)-strlen(fileExtension)-1吗?

标签: c string char strncpy


【解决方案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

【讨论】:

  • 感谢您的帮助。这一直困扰着我多年
【解决方案2】:

在您的代码中,您正在计算一个内存区域的 strlen logFileName 字符串之前。

好像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);

在寻找错误时简化代码。

【讨论】:

    【解决方案3】:

    你应该改变这个:

    strlen(LogRotateConfiguration-&gt;logFileName-strlen(fileExtension)-1)

    到这里:

    (strlen(LogRotateConfiguration-&gt;logFileName)) - (strlen(fileExtension)-1)

    这里你首先得到文件名的完整strlen,然后减去文件扩展名的strlen,而不是得到logfilename-strlen(fileextension)的strlen

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多