繁体   English   中英

用strncat连接两个字符串

[英]Concatenating two strings with strncat

我想连接两个字符串,添加一个新的随机字符,使用strncat()所以基本上我这样做:

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

#define CHARACTER_RANGE 25
#define INITIAL_CHARACTER 65

int main(){
    char male[32] = "A", female[32] = "B", new_letter[1], new_name[32];
    srand(time(NULL));

    strcpy(new_name, male);
    strncat(new_name, female, sizeof(new_name) - strlen(new_name) - 1);

    new_letter[0]= (rand() % CHARACTER_RANGE) + INITIAL_CHARACTER;

    strncat(new_name, new_letter, sizeof(new_name) - strlen(new_name) - 1);

    printf("New string is %s!\n", new_name);

    return 0;
}

如果新信是F,预期结果应该是:

New string is ABF!

相反,结果是:

New string is ABFAB!

我无法弄清楚为什么会这样。

第二次调用strncat是不正确的:

strncat(new_name, new_letter, sizeof(new_name) - strlen(new_name) - 1);

new_letter不是一个合适的C字符串,因为它没有空终止符,也没有空格来存储它。 如果sizeof(new_name) - strlen(new_name) - 1大于1 ,则行为未定义。

这是一个更正版本:

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

#define CHARACTER_RANGE 25
#define INITIAL_CHARACTER 65

int main() {
    char male[32] = "A", female[32] = "B", new_letter[2], new_name[32];

    srand(time(NULL));

    strcpy(new_name, male);
    strncat(new_name, female, sizeof(new_name) - strlen(new_name) - 1);

    new_letter[0] = (rand() % CHARACTER_RANGE) + INITIAL_CHARACTER;
    new_letter[1] = '\0';

    strncat(new_name, new_letter, sizeof(new_name) - strlen(new_name) - 1);

    printf("New string is %s!\n", new_name);
    return 0;
}

但请注意,对strcpy是在没有保护的情况下执行的。 在此特定示例中,源字符串适合目标缓冲区,但对于更通用的方法,有一种更简单的方法可以使用snprintf在固定数组边界内构造字符串:

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

#define CHARACTER_RANGE   26
#define INITIAL_CHARACTER 'A'

int main() {
    char male[] = "A", female[] = "B", new_name[32];

    srand(time(NULL));

    snprintf(new_name, sizeof new_name, "%s%c",
             rand() % 2 ? female : male, 
             rand() % CHARACTER_RANGE + INITIAL_CHARACTER);

    printf("New string is %s!\n", new_name);
    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM