我在编译程序时遇到了问题,但是在尝试将strcpy和strcat压缩为snprintf(以删除不必要的代码行)时,在编译警告时会出现问题,  传递'snprintf'的参数2会使指针产生整数,而无需强制转换呈现自己。我曾尝试寻找其他有此问题的人,但是,一旦改编,他们的解决方案似乎就无法与我的代码一起使用fileDir在程序开始时定义为:char fileDir[1000];event->name是文件的名称(及其扩展名),例如picture1.jpg。hashDirectory是"/home/user/Documents/_Hash"。FILE *ftest2=fopen(snprintf(fileDir, "%s: %s: %s", hashDirectory, event->name, ".txt"), "wt");我可以打开文件,但是只有在使用strcpy和strcat时才可以打开-这就是我要摆脱的文件。 最佳答案 因此,所有注释都证明您的代码存在一些问题。现在,我们将跳过fopen并专注于snprintf。 snprintf与printf相似,不同之处在于,首先需要传递两个附加参数:一个char *指示将呈现的字符数据存储在何处,以及一个size_t指示在。做到这一点的惯用方法(假设目标是char *)是使用char[],如下所示:int res = snprintf(fileDir, sizeof(fileDir), /* Other arguments omitted */);sizeof()返回打印的字符数(作为snprintf)。如果该数字大于或等于int,则sizeof(fileDir)中的所有内容都将被截断(但始终会以fileDir终止)。if (res >= sizeof(fileDir)) { /* fileDir contains an incomplete path, handle this as an error */}最后,由于NULL的返回值是snprintf,因此您不能将其作为int的第一个参数传递,因为它期望第一个参数是fopen。因此,这些步骤需要分开进行。综上所述,构建路径的方式似乎也不正确。在下面的完整示例中,我已修复它:FILE *ftest2;int res = snprintf(fileDir, sizeof(fileDir), "%s/%s.txt", hashDirectory, event->name);if (res >= sizeof(fileDir)) { fprintf(stderr, "The pathname was truncated. Cannot proceed.\n"); return -1;}ftest2 = fopen(fileDir, "wt");if (!ftest2) { fprintf(stderr, "Failed to open `%s': %s\n", fileDir, strerror(errno)); return -1;}/* Rest of your code */重要说明,如果const char *的第一个参数是指向动态分配内存的指针(即来自snprintf的指针),则您将无法使用malloc,而是需要传递动态分配的大小明确地区域。 sizeof()在编译时(忽略VLAs)而不是在运行时被评估。(如果要使用该部分,则需要sizeof() #include和string.h才能使errno.h调用正常工作)
09-16 06:47