我在下面的代码中获取了一个文件名,并生成了一个新文件,该文件名相同,但以.c结尾
然而,当我尝试将文件名转换为以.c结尾时,我尝试打印结果以检查它是否工作,printf什么也不打印,如果有区别,文件名是一个从int main指向argv[1]的指针(int argc,char *argv[])。
下面是代码:
bool file_genEquiCFile(char *file_name)
{
// Maybe add a memmove to preserve the original buffer
printf("file_name before change: %s\n", file_name);
while (file_name && *file_name != '.')
file_name++;
if (file_name)
{
if (*file_name++ == '.')
{
*file_name++ = 'c';
*file_name = '\0';
// For now use "w" mode which makes an empty file for writing.
FILE *c_file = fopen(file_name, "w");
fclose(c_file);
printf("file_name after change: %s\n", file_name);
return true;
}
else
return false;
}
return false;
}
顺便说一下,file_name指向一个名为hey.txt的文件,下面是printf打印的内容:
file_name before change: hey.txt
file_name after change:
3条答案
按热度按时间jv4diomz1#
在
*file_name = '\0';
之后,file_name
指向0字符串,因为file_name
指向的是终止NUL字符。您应该将原始的
file_name
存储在函数的开头,并在以后使用它,而不是修改后的file_name
。此外,您可能希望在第一个
while
和if
中使用*file_name
而不是file_name
,以检查指针是否不是NULL
,而是指针所指向的是否是NUL字符。6uxekuva2#
while (file_name && *file_name != '.')
没有任何意义。左操作数检查file_name
是否为空指针。这是错误的,您应该检查所指向的内容是否为空终止符:类似地,
if (file_name)
没有任何意义,应该是if (*file_name)
或if (*file_name != '\0')
。至于代码应该做的事情是否一开始就有意义,我不知道。
js4nwp543#
问题是,你不仅改变了字符串
file_name
的内容,而且还改变了file_name
字符串开始的指针,当你到达printf
时,指针只指向\0
部分,这就是printf
将打印出来的内容:空字符串。有很多方法可以解决这个问题,可能最简单的方法是保存指针在字符串的开头,它仍然指向字符串的开头,并确保在需要引用新文件名时使用该指针:
请注意,您仍然在修改内存中的底层字符串,因此如果这是一个函数,则调用者的
file_name
(字符串)的内容也会发生变化,如果这不是您想要的,则必须先复制字符串,然后再对其进行任何更新。