gpt4 book ai didi

c - 如何使用C检查文件名中是否有 `\0`字符?

转载 作者:行者123 更新时间:2023-11-30 21:14:06 25 4
gpt4 key购买 nike

我想写一个这样的函数:

int validate_file_name(char *filename)
{
//...
}

这将:

  • 如果没有\0则返回1文件名中的字符,
  • 否则为 0。

我认为可以使用简单的 for(size_t i = 0; i < strlen(filename); i++) 来实现,但我不知道如何确定我必须检查多少个字符?

我无法使用 strlen()因为它将在第一次出现 \0 时终止性格。

我应该如何解决这个问题?

<小时/>

澄清:

我正在尝试申请these guidelines到我收到的文件名。如果您应该避免输入 \0在文件名中,如果没有大小参数,如何验证它。

此外,还有多个 \0 的字符串字符,如下所示:http://www.gnu.org/software/libc/manual/html_mono/libc.html#Argz-and-Envz-Vectors 。不过,我不知道如果没有明确提供,就不可能确定它们的长度。

<小时/>

结论:

无法确定非 NULL 终止的字符串的长度。除非你知道类(class)的长度或者你部署了一些肮脏的黑客:Checking if a pointer is allocated memory or not .

最佳答案

您正在尝试解决一个不需要解决的问题。

文件名是一个字符串。在 C 中,“字符串”的定义是“以第一个 null 结尾并包含第一个 null 的连续字符序列”字符”。

字符串或文件名中不可能嵌入空字符。

可以有一个嵌入空字符的字符序列。例如:

char buf[] = "foo\0bar.txt";

buf 是一个 12 个字符的数组;位置 3 和 11 处的字符都是空字符。如果您将 buf 视为字符串,例如通过调用

fopen(buf, "r")

它将被视为长度为 3 的字符串(字符串的长度不包括终止空字符)。

如果您正在使用可能包含或不包含字符串的字符数组,那么按照您的要求进行操作是有意义的。您需要通过传递附加参数或将指针和长度包装在结构中来独立于初始字符的地址来跟踪缓冲区的大小。

但是,如果您要处理文件名,几乎可以肯定最好只处理字符串,并假设传递给函数的任何 char* 值都指向有效的字符串。如果没有(如果数组中任何地方都没有空字符),那就是调用者的错误,而不是您可以合理检查的错误。

(顺便说一下,Unix/Linux 文件系统明确禁止文件名中包含空字符。/ 字符也被禁止,因为它用作目录名分隔符。Windows 文件系统有更严格的规则。 )

最后一点:NULL 是(扩展为)空指针常量。请不要使用术语 NULL 来指代空字符 '\0'

关于c - 如何使用C检查文件名中是否有 `\0`字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30551432/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com