【问题标题】:How to add a number to the middle of a string in a time-efficient way?如何以省时的方式将数字添加到字符串的中间?
【发布时间】:2023-02-22 21:37:58
【问题描述】:

我有这个:

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

int main(void){
    const char* pFilename = NULL;

    pFilename = "Something.png"

    functionX(pFilename, argX);
}

但是,我想在循环中调用该函数,使用不同的文件名,如“Something0.png”、“Something1.png”等

经过一番挖掘,我想出了这个:

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

int main(void){
    const char* pFilename = NULL;
    char buffer[4];
    char nameStd[] = "Something";
    char namePng[] = ".png";
    char nameAll[17];

    pFilename = "Something.png"

    for (i = 0; i < 100; i++) {
        snprintf(buffer, sizeof(buffer), "%d", i);
        strcat(nameAll, pFilename);
        strcat(nameAll, buffer);
        strcat(nameAll, namePng);
        functionX(nameAll, argX);
        memset(nameAll,0,strlen(nameAll));
    }
}

好吧,我不确定这是否有效。而且我现在无法执行代码(因为 functionX 需要特定的外围设备)。 但即使它确实有效,它真的是最省时的方法吗?

【问题讨论】:

  • 也许最快的方法是将字符串“Something___.png”和 sprintf 数字直接放入 _ 所在的位置(使用 %03d,或者如果您不想要尾随零,则使用“%d.png”),那么您不需要根本不需要做字符串复制
  • char nameAll[17];为什么要省吃俭用? char nameAll[ 32 ]; sprintf( nameAll, "Prefix%d.png", i ); 一个声明......并且,之后不要重置缓冲区。不必要...编写有效的代码,不用担心性能...计算机不再由真空管制成...
  • 有点偏离主题,但是 char nameAll[17]; strcat(nameAll, pFilename); 是未定义的行为,因为 nameAll[] 尚未被清除(即不是您可以 strcat 到的有效字符串)。第一次使用strcpy,或者只使用nameAll[0] = '\0'
  • 时间效率?这应该不是一个真正的问题,生成 100 个文件名,无论使用何种方法,都不会消耗大量时间。最简单的是使用sprintf(nameAll,"Something%d.png",'i);之类的东西
  • @ATSlooking4things 是的。

标签: c string performance strcat


【解决方案1】:

组装零件通常要容易得多。可以按照上面的建议通过 snprintf() ,也可以自己构建字符串。前缀不会改变,您只需要在添加另一个数字时添加后缀。对于 1e6 字符串,它比 snprintf() 快大约 60%,但可能不值得这么复杂:

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

// A constant expression of log10(INT_MAX) + 1
#define str_uint32_t_len sizeof(uint32_t) * CHAR_BIT * 21306 / 70777 + 2

uint32_t uint32_t_len(uint32_t i) {
    uint32_t n = !i;
    for(uint32_t j = i; j; j /= 10, n++);
    return n;
}

// s is not '
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-09
相关资源
最近更新 更多