【问题标题】:C Transforming array into string using sprintfC使用sprintf将数组转换为字符串
【发布时间】:2015-11-09 12:33:50
【问题描述】:

我已使用 fscanf 将“ABCDEFGHIJK”扫描到一个 char 数组 [26] 中。然后我使用“for”将“ABCDEFGHIJK”放入另一个数组[11]。现在我需要访问“ABCDEFGHIJK.mp4”数组[15],以便将该文件名输入到重命名函数中。

除了printf、scanf、for和while之外,我对C编程了解不多。

    sprintf(filename, "%c%c%c%c%c%c%c%c%c%c%c.mp4", codigo[0], codigo[1], codigo[2], codigo[3], codigo[4], codigo[5], codigo[6], codigo[7], codigo[8], codigo[9], codigo[10]);

上面这段代码似乎可以工作,但我想知道是否有更简单的方法(尤其是对于更大的数组)?

澄清:我有一个 txt 文件,格式为包含不带扩展名的文件名和人类文件名。我正在尝试制作一个程序,将这些文件重命名为正确的名称,因为它们来自失败的备份。

编辑:这是完整的程序。我重命名了变量以使其更有意义,因此“codigo”现在是“idcode”。

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

int main(void)
{
    int i, j, k;

    char value1[26], value2[70], idcode[11], filename[16], fullname[64], filenamestring[16], fullnamestring[64];

    // Opening file.

    FILE *nomes;
    nomes = fopen("/Users/EA/Desktop/Songs/backup.txt", "rt");
    if(nomes == NULL)
    {
        printf("Erro ao abrir backup.txt");
        exit(1);
    }

    // Skipping beggining of file until first value.

    for(i=0; i<10; i++)
        {
            fscanf(nomes, "%*s");
        }

    // Reading first value, and repetition.

    while(fscanf(nomes, "%s", value1) == 1)
    {
        j = k = 0;

        // Extracting idcode from value1.

        for(i=7; i<18; i++)
        {
            idcode[j] = value1[i];
            j++;
        }

        // Filling the complete filename.

        sprintf(filename, "%.*s.mp4", 11, idcode);

        // Reading second value, the "human" filename.

        fscanf(nomes, "\n%[^\n]", value2);
        for(i=6; i<70; i++)
        {
            fullname[k] = value2[i];
            k++;
        }

        // Transforming filenames into strings for rename function.

        strncpy(filenamestring, filename, 16);
        strncpy(fullnamestring, fullname, 64);

        // Renaming the files.

        rename(filename, fullname);

        // Skipping useless data before the next cycle.

        for(i=0; i<9; i++)
        {
            fscanf(nomes, "%*s");
        }
    }

    // Closing file and ending program.

    fclose(nomes);
    return(0);
}

【问题讨论】:

  • 假设数组是char的数组,为什么不简单的把一个字符串终止符放在最后作为字符串呢?
  • 例如,如果array[15] 实际上比array[16] 大一点,那么char array 可以在末尾包含NULL 终止符,从而使char array 成为您的典型C 字符串。
  • 不需要它是一个以零结尾的字符串,只需使用%.*s

标签: c arrays


【解决方案1】:

看起来你有一个char 的数组。 你可以这样做:

sprintf(filename, "%.*s.mp4", 11, codigo)

您可以在this 问题中阅读有关%.*s 说明符的更多信息。

【讨论】:

  • 虽然它是指向 C++ 参考的链接,但它仍然是 C 文档。无论如何我都删除了它,请删除您的反对票。这不是必需的。我还删除了您的编辑,它可能不安全,如果 codigo 没有在堆栈上分配,它只会返回指针的大小。
  • 我的编辑是因为你使用snprintf()!!!您的回答值得反对。哪个指针的大小?
  • @iharob sprintf 很好,因为字符串替换长度的上限是静态已知的。
  • @FUZxxl 我的意思是原来的答案是snprintf(filename, "%.s.mp4", 15, codigo)
  • ...差不多好了:从codigo只需要打印11个字符,而不是15个(包括.mp4是15个)。
【解决方案2】:

如果您只想将格式“.mp4”附加到字符串的末尾,那么最简单的方法就是:

strcat(filename,".mp4");

在您将不带“.mp4”的名称打印到其中之后。 如果你真的想使用 sprintf 那么我认为这就足够了:

sprintf(filename,"%s.mp4", codigo);

另外,如果你想让你的字符串更大并且不固定大小,你可以在它的末尾加上“\0”(如果你尝试在其他编程语言中使用字符串,这可能不起作用,但c) strcat 如上,或者你可以这样做:

memset(&filename, 0, sizeof(filename));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-11
    • 1970-01-01
    • 2016-11-20
    相关资源
    最近更新 更多