C - 用 getpid() 中的 ID 替换字符串中的 $$?

标签 c string replace

如果我有如下字符串:

char* exampleString = "test$$";

假设 getpid() 返回 1587

如何用 getpid() 的结果替换字符串中的 $$,使结果成为字符串 "test1587"?

最佳答案

由于 "test$$" 是不可变的,指向它的指针最好是 char const* 而不是 char*必须将它复制到一个数组中,然后您可以在其中替换 "$$"

可能的解决方案:

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

#include <unistd.h>

int main(void)
{
    char const *input = "foo$$bar";
    pid_t pid = 1234;

    size_t format_length = strlen(input);
    char *format = calloc(format_length + 2, 1);
    if (!format) {
        fputs("Couldn't allocate memory :(\n\n", stderr);
        return EXIT_FAILURE;
    }

    // copy input to format replacing "$$" with "%ld" in the process
    bool replacement_done = false;
    for (size_t i = 0; i < format_length + replacement_done; ++i) {
        if (!replacement_done && i + 1 < format_length &&
            input[i] == '$' && input[i + 1] == '$')
        {
            format[  i] = '%';  // just
            format[++i] = 'l';  // being
            format[++i] = 'd';  // safe.
            replacement_done = true;
            continue;
        }

        format[i] = input[i - replacement_done];
    }

    if (!replacement_done) {
        free(format);
        fputs("Nothing to do :(\n\n", stderr);
        return EXIT_FAILURE;
    }

    char *result = malloc(1);
    if (!result) {
        free(format);
        fputs("Couldn't allocate memory :(\n\n", stderr);
        return EXIT_FAILURE;
    }

    // there is no guesswork needed, snprintf() will tell the needed size
    int bytes_needed = snprintf(result, 1, format, (long)getpid());
    if (bytes_needed < 0) {
        free(format);
        free(result);
        fputs("snprintf() failed :(\n\n", stderr);
        return EXIT_FAILURE;
    }

    char *temp = realloc(result, ++bytes_needed);
    if (!temp) {
        free(format);
        free(result);
        fputs("Couldn't allocate memory :(\n\n", stderr);
        return EXIT_FAILURE;
    }
    result = temp;

    int written = snprintf(result, bytes_needed, format, (long)getpid());  // long should be big enough
    if(written < 0 || written >= bytes_needed ) {
        free(format);
        free(result);
        fputs("snprintf() failed :(\n\n", stderr);
        return EXIT_FAILURE;
    }

    puts(result); // done.

    free(format);
    free(result);
}

关于C - 用 getpid() 中的 ID 替换字符串中的 $$?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53311499/

相关文章:

C二维数组二维数组

c - do-while 循环只迭代一次月供

c - 'static' 函数的原型(prototype)

c++ - 编译返回字符串 & 的函数的问题

正则表达式在字符串中查找单词,替换新字符串中的单词(使用 Notepad++)

c - 没有成员的结构

python - 在python中将特殊字符转换为原始形式

c++ - 在线程之间发送和读取字符串

javascript - jQuery 搜索和替换不起作用(Wordpress)

php - 删除字符串后的字符?