gpt4 book ai didi

c++ - strncat _emulations_ multiple calls ignore changed n?

转载 作者:行者123 更新时间:2023-11-28 02:43:21 26 4
gpt4 key购买 nike

为了自学,这里有我的 strncat 的两个版本(一个带有指针+偏移符号和一个数组版本):

// 08_38.cpp                                                                    
#include <iostream>
#include <cstring>

char * strncatPtr(char * a, char * b, size_t n);
char * strncatArr(char * a, char * b, size_t n);

int main (void) {

char string1[20] = "foobarqwerty";
char string2[20] = "asd";

// strncat
std::cout << "-----------------------" << std::endl;
std::cout << "--------STRNCAT--------" << std::endl;
std::cout << "-----------------------" << std::endl;
std::cout << strncat(string2, string1, 6) << std::endl;
std::cout << strcpy(string2, "asd") << std::endl;

std::cout << strncatPtr(string2, string1, 4) << std::endl;
std::cout << strcpy(string2, "asd") << std::endl;

std::cout << strncatArr(string2, string1, 3) << std::endl;
std::cout << strcpy(string2, "asd") << std::endl;

return 0;
}

// ------------------------------------
char * strncatPtr(char * a, char * b, size_t n){
unsigned int i = 0;
// go to the end;
for(; *(a+i) != '\0'; i++);
// and start copying
for(unsigned int j = 0;
((*(a+i+j) = *(b+j)) != '\0') && (j < n-1);
j++);
return a;
}

char * strncatArr(char * a, char * b, size_t n){
unsigned int i = 0;
// go to the end;
for(; a[i] != '\0'; i++);
// and start copying
for(unsigned int j = 0;
((a[i+j] = b[j]) != '\0') && (j < n-1);
j++);
return a;
}

我不明白为什么当我测试它们时它认为每个函数调用的 size = 6

-----------------------
--------STRNCAT--------
-----------------------
asdfoobar
asd
asdfoobar
asd
asdfoobar
asd

但如果我分别测试它们,每次评论 2 个不同的调用,它们工作正常......你能告诉我吗?

最佳答案

如果复制的字符数小于要连接的字符串的长度,则您没有添加空终止符来指示字符串的结尾。

关于c++ - strncat _emulations_ multiple calls ignore changed n?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25201350/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com