获得一定长度的字符串。

时间:2012-06-15 14:01:59

标签: c string char strncpy

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

如果我有文件名mylog.txt我只想要出来mylog

我试过以下

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

出于某种原因,当我运行这个时,我只得到m而不是文件名的其余部分。我永远不会知道文件名或扩展名中有很多字符,所以需要弄清楚它需要得到的部分。

基本上,问题是如何在没有扩展名的情况下获取文件的名称。

感谢您提供的任何帮助。

3 个答案:

答案 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)。