c - 在文件名中添加数字

标签 c string scope undefined-behavior

我想将数据存储在不同的文件中。因此,我想创建如下文件:data_1.logdata_2.log、...、data_N.log。附录 .log 不是必需的,但会很好。到目前为止我所有的方法都失败了。这是一个可能接近我需要的示例:

#include <stdio.h>
#include <string.h>

char get_file_name(int k){ 
    int i, j;
    char s1[100] = "logs/data_";
    char s2[100];
    snprintf(s2, 100, "%d", k);
    for(i = 0; s1[i] != '\0'; ++i);
    for(j = 0; s2[j] != '\0'; ++j, ++i){
        s1[i] = s2[j];
    }
    s1[i] = '\0';
    return s1;
}

int main(){

    char file_name[100];
    for(int k=0; k<10; k++){
        // Get data
        // ...
        // Create filename
        strcpy(file_name, get_file_name(k));
        printf("%s", file_name);
        // fp = fopen(file_name, "w+");
        // Write data to file
        // print_results_to_file();
        // fclose(fp);
    }

    return 0;
}

目前我收到以下我不明白的错误:

    string.c: In function ‘get_file_name’:
string.c:14:12: warning: returning ‘char *’ from a function with return type ‘char’ makes integer from pointer without a cast [-Wint-conversion]
     return s1;
            ^~
string.c:14:12: warning: function returns address of local variable [-Wreturn-local-addr]
string.c: In function ‘main’:
string.c:24:27: warning: passing argument 2 of ‘strcpy’ makes pointer from integer without a cast [-Wint-conversion]
         strcpy(file_name, get_file_name(k));
                           ^~~~~~~~~~~~~~~~
In file included from string.c:2:
/usr/include/string.h:121:14: note: expected ‘const char * restrict’ but argument is of type ‘char’
 extern char *strcpy (char *__restrict __dest, const char *__restrict __src)
              ^~~~~~

是否有更简单的方法来创建此类文件名?我不敢相信没有这样的人。

最佳答案

此代码存在各种问题,这里没有一一纠正它们,而是另一种方法。它不是唯一的,但它很简单,应该易于理解和适应:

#include <stdio.h>

void get_file_name(int k, char* buffer, size_t buflen) {
    snprintf(buffer, buflen, "logs/data_%d.log", k);
}

int main() {
    const size_t BUFLEN = 50;
    char file_name[BUFLEN];

    for (int i = 0; i < 10; i++) {
        get_file_name(i, file_name, BUFLEN);
        printf("%s\n", file_name);
        // Code for writing to file.
    }
}

一些细节:

  1. 此函数不是尝试返回(指向)内存,而是传递写入的缓冲区。调用者需要确保缓冲区足够大(这里总是这种情况,但如果实际文件名更长,您应该添加检查 snprintf 返回值并执行适当操作的逻辑错误处理)。

  2. 该函数的实际逻辑只需要对 snprintf 进行一次调用,它已经执行了您需要的所有操作,因此尚不清楚拥有一个单独的函数是否有必要或有帮助。

  3. 上面使用了可变长度数组。如果您想确保缓冲区恒定,可以使用 #define 代替 const size_t 变量作为缓冲区长度。不过,这里使用变长数组是可以的,有些编译器甚至将其转换为常量数组。

正如评论中提到的,重要的是您 (a) 阅读并理解您正在使用的函数的文档,以及 (b) 阅读并理解编译器错误消息。

关于c - 在文件名中添加数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56397022/

相关文章:

c - 如何使while循环中的随机数相互独立?

c - Scanf 输入中的每个数字,直到用户输入 0

java - 大写问题,使用 IndexOf

php - 在 array_filter 中使用外部变量

c++ - 函数是否在退出作用域时清除动态内存?

c - 对于在 C 中作为函数参数传递的数组,a 和 &a 不同

c - 从锁定的 SQLite3 数据库中读取

lambda - 计划中的关闭如何运作?

java - 每次都创建字符串文字吗?

java - 将字符串拆分为用户所需的字符数