【问题标题】:Append part of a string to another string将字符串的一部分附加到另一个字符串
【发布时间】:2017-06-06 23:26:32
【问题描述】:

我正在尝试制作一个简单的程序,将其他字符串的一部分附加到另一个字符串。当我运行此代码时,它不会输出任何内容。对不起,我的C知识很低。感谢所有帮助。

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

int main() {
    char stuff[100] = "Y";
    char test[] = "hello", test2[] = "shelllo";

    strcat(stuff, test[1]);
    strcat(stuff, test2[0]);

    printf("%s\n", stuff);

    return 0;
}

【问题讨论】:

    标签: c string char append strcat


    【解决方案1】:

    您需要从 strcat 中删除数组索引,该索引应如下所示:

    strcat(stuff, test);
    strcat(stuff, test2);
    

    请注意,testtest2 是字符串,但 test[1]test2[0] 只是单个字符(es) - strcat 适用于字符串,而不是单个字符。

    如果您只想复制字符串的一部分(即跳过前几个字符),则使用指针算法

    strcat(stuff, test + 1); // skip 1st character of test (ie start copying from `e`)
    

    或者,

    strcat(stuff, test2 + 3); // skip 3 characters of test2 (ie starting copying from `l`)
    

    【讨论】:

    • 我只想将变量的某些部分添加到东西中。
    • 谢谢你的回答:)
    【解决方案2】:

    您使用char 参数而不是指向char 的指针调用strcat,行为未定义。

    以下是复制部分字符串的解决方案:

    • 使用strncat():它将不超过给定数量的字符复制到其第一个参数的末尾。
    • 使用snprintf()%.*s 格式。 %s 格式的 precision 字段指定从字符串复制的最大字符数。它可以指定为十进制数或*,在这种情况下,精度作为int 参数在字符串参数之前传递。

    这是一个例子:

    #include <stdio.h>
    #include <string.h>
    
    int main(void) {
        char stuff[100];
        char test[] = "Hello";
        char test2[] = "The world is flat";
    
        /* using strncat */
        strcpy(stuff, test);
        strncat(stuff, test2 + 3, 6);
        printf("%s\n", stuff);
    
        /* safer version using snprintf */
        snprintf(stuff, sizeof stuff, "Hello %.*s\n", 5, test2 + 4);
        printf("%s\n", stuff);
    
        return 0;
    }
    

    【讨论】:

    • 也许对%.* 的作用进行一些解释会很好——它不常用
    • 谢谢。请问,为什么第二个“更安全”?
    • @artm:答案已更新。它确实很少使用,但对于选定的情况非常方便。
    • @SycoSins:使用snprintf更安全,因为可以传递目标数组的大小,所以snprintf 不会导致缓冲区溢出。 strncat 没有此信息,由程序员检查目标数组中字符串末尾是否有足够的空间用于连接的子字符串。众所周知的风险更大的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    • 2011-05-25
    • 1970-01-01
    相关资源
    最近更新 更多