【问题标题】:Including a string into another string in C在 C 中将一个字符串包含到另一个字符串中
【发布时间】:2012-02-04 20:05:28
【问题描述】:

如何在 C 中将一个字符串“包含”到另一个字符串中?

这是一个例子:

string1 = "www.google";
string2 = "http://"+string1+".com";

我在使用 strcat() 时遇到了困难。

谢谢

【问题讨论】:

  • sprintf 可能会成功。

标签: c string concatenation strcat


【解决方案1】:

如果有可用空间,您可以使用snprintf 及其功能返回所需的大小:

const char *string1 = "www.google";
char *string2;
size_t length;

length = snprintf(NULL, 0, "http://%s.com", string1);
if (length < 0) {
    // Handle error.
} else {
    string2 = malloc(length + 1);
    snprintf(string2, length + 1, "http://%s.com", string1);
}

稍微不同的变体,避免使用格式字符串两次:

const char *string1 = "www.google";
const char *format = "http://%s.com";
char *string2;
size_t length;

length = snprintf(NULL, 0, format, string1);
if (length < 0) {
    // Handle error.
} else {
    string2 = malloc(length + 1);
    snprintf(string2, length + 1, format, string1);
}

【讨论】:

    【解决方案2】:

    我在使用 strcat() 时遇到了困难

    那就试试 sprintf:

    char str[] = "www.google";
    char dest[100];
    
    snprintf(dest, sizeof(dest), "http://%s.com", str);
    

    7.19.6.5-3

    snprintf 函数返回字符数 已经写了 n 足够大,不算 终止空字符。

    【讨论】:

    • 请注意,如果您不首先检查str 的长度,这会导致潜在的缓冲区溢出!
    • snprintf 可以告诉您它需要多少空间,这样可以轻松准确地分配所需的内存量,而不是使用静态缓冲区。
    • @DarkDust 没错,你只需要传递 0 作为大小。
    • @DarkDust The Microsoft C Runtime Library version of snprintf 不返回所需的缓冲区大小,但返回 -1 表示失败(对于非常旧的 glibc 版本也是如此),所以遗憾的是它不是可移植的。
    • @GameZelda 这很不幸,但很高兴知道。我编辑了这个问题,以完全清楚地表明标准要求“可以写”的行为。
    猜你喜欢
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 2013-11-26
    • 2014-04-14
    相关资源
    最近更新 更多