使用 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 字符串,因为它没有空终止符,也没有任何 space 可以在字母后存储它。如果 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] = '[=11=]';
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;
}
我想连接两个字符串,添加一个新的随机字符,使用 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 字符串,因为它没有空终止符,也没有任何 space 可以在字母后存储它。如果 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] = '[=11=]';
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;
}