gpt4 book ai didi

C strcat/strcpy 到字符指针无法正确打印

转载 作者:行者123 更新时间:2023-11-30 15:17:09 32 4
gpt4 key购买 nike

我有一个简单的程序,我正在尝试了解 strcat 和 strcpy。但是,它似乎不太正常。

似乎复制并附加得很好。但是,当我打印时,我认为它正在访问其范围之外的内存位置。

代码如下:

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

int main(int sep, char ** arr)
{
int i, size = sep;

// Get size of whole string including white spaces
for(i = 1; i < sep; i++)
size += strlen(arr[i]) + 1;

// Allocate memory
char *ptr = malloc(size);

for(i = 0; i < sep; i++)
{
// Copy first string then append
if(i >= 1)
strcat(ptr, arr[i]);
else
strcpy(ptr, arr[i+1]);

//Replace null byte
ptr[strlen(ptr)] = ' ';
}

// Add nullbyte to end
ptr[strlen(ptr) + 1] = '\0';

// Print whole string
printf("\n%s\n\n", ptr);

return 0;
}

如果我传递此字符串:O_O hi o noe0x1828GFF2 32 32 32 3 23 2 3,它会打印以下内容:

O_O O_O hi o noe0x1828GFF2 ??32 ??t?32 ?̐?32 3 23 2 3

如您所见,它打印第一个字符串,直到两倍的空格以及许多不在字符串中的字符。

我在这里做错了什么?

编辑:找出开头的双字符串。只需要在 strcat(ptr, arr[i]); 中向 arr[i] 添加 +1 即可。但是,它仍然打印其中不存在的字符。

如果我去掉这一行:ptr[strlen(ptr)] = ' ',奇怪的字符不存在,但它也会留下空格。

最佳答案

通过行 ptr[strlen(ptr)] = ' ';,您可以删除字符串末尾的终止 NULL 字符,从而干扰对 strlen()< 的后续调用strcat()

尝试用保存终止 NULL 的代码替换:

ptr[strlen(ptr)+1] = '\0';
ptr[strlen(ptr)] = ' ';

或更优化的版本,不会调用 strlen() 两次:

int len = strlen(ptr);
ptr[len] = ' ';
ptr[len+1] = '\0';

关于C strcat/strcpy 到字符指针无法正确打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32663766/

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