C语言 为什么printf不打印任何东西?

nwnhqdif  于 2023-03-17  发布在  其他
关注(0)|答案(3)|浏览(326)

我在下面的代码中获取了一个文件名,并生成了一个新文件,该文件名相同,但以.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:
jv4diomz

jv4diomz1#

*file_name = '\0';之后,file_name指向0字符串,因为file_name指向的是终止NUL字符。
您应该将原始的file_name存储在函数的开头,并在以后使用它,而不是修改后的file_name

bool file_genEquiCFile(char *file_name)
{
    char *file_name_orig = 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_orig, "w");
        fclose(c_file);
        printf("file_name after change: %s\n", file_name_orig);

        return true;
        }
        else
            return false;
    }
        
    return false;
}

此外,您可能希望在第一个whileif中使用*file_name而不是file_name,以检查指针是否不是NULL,而是指针所指向的是否是NUL字符。

6uxekuva

6uxekuva2#

while (file_name && *file_name != '.')没有任何意义。左操作数检查file_name是否为空指针。这是错误的,您应该检查所指向的内容是否为空终止符:

while (*file_name != '\0' && *file_name != '.')

类似地,if (file_name)没有任何意义,应该是if (*file_name)if (*file_name != '\0')
至于代码应该做的事情是否一开始就有意义,我不知道。

js4nwp54

js4nwp543#

问题是,你不仅改变了字符串file_name的内容,而且还改变了file_name字符串开始的指针,当你到达printf时,指针只指向\0部分,这就是printf将打印出来的内容:空字符串。
有很多方法可以解决这个问题,可能最简单的方法是保存指针在字符串的开头,它仍然指向字符串的开头,并确保在需要引用新文件名时使用该指针:

char* file_name_save = file_name;
(...)
FILE *c_file = fopen(file_name_save, "w");
fclose(c_file);
printf("file_name after change: %s\n", file_name_save);

请注意,您仍然在修改内存中的底层字符串,因此如果这是一个函数,则调用者的file_name(字符串)的内容也会发生变化,如果这不是您想要的,则必须先复制字符串,然后再对其进行任何更新。

相关问题