c - 获取一定长度的字符串。

标签 c string char strncpy

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

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

我试过以下方法

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

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

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

感谢您提供的任何帮助。

最佳答案

嗯?

您是否认真地从传递给 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.

关于c - 获取一定长度的字符串。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11052141/

相关文章:

c - OSX - 使用 llc "llc: : error: unable to get target for ' wasm3 2', see --version and --triple."编译为 WebAssembly

c - 如何删除 C 中 FILE* 指向的文件?

c - 如何解释 *( (char*)&a )

string - 有 ChucK 的字符串操作库吗?

string - Flutter 拆分并使特定单词加粗

c - C栈数组实现

javascript - 将文本放入固定大小的 div

c++ - (C++) 字符串文字与参数列表不匹配

java - 如何通过java快速将字符串数组转换为二维字符数组?

检查一个字符是否等于\in C