C strcat/strcpy 字符指针打印不正确
C strcat/strcpy to character pointer not printing correctly
我有一个简单的程序,我正在尝试了解 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] = '[=11=]';
// 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
如您所见,它打印了第一个字符串直到空格两次,以及许多甚至不在字符串中的字符。
我在这里做错了什么?
编辑:找出开头的双字符串。只需将 +1 添加到 strcat(ptr, arr[i]);
中的 arr[i]。但是,它仍然会打印其中不存在的字符。
如果我去掉这一行:ptr[strlen(ptr)] = ' '
,奇怪的字符就不存在了,但它也会留下空格。
在行 ptr[strlen(ptr)] = ' ';
中,您删除了字符串末尾的终止 NULL 字符,干扰了对 strlen()
和 strcat()
.
的后续调用
尝试用保存终止 NULL 的代码替换:
ptr[strlen(ptr)+1] = '[=10=]';
ptr[strlen(ptr)] = ' ';
或不调用 strlen()
两次的更优化版本:
int len = strlen(ptr);
ptr[len] = ' ';
ptr[len+1] = '[=11=]';
我有一个简单的程序,我正在尝试了解 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] = '[=11=]';
// 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
如您所见,它打印了第一个字符串直到空格两次,以及许多甚至不在字符串中的字符。
我在这里做错了什么?
编辑:找出开头的双字符串。只需将 +1 添加到 strcat(ptr, arr[i]);
中的 arr[i]。但是,它仍然会打印其中不存在的字符。
如果我去掉这一行:ptr[strlen(ptr)] = ' '
,奇怪的字符就不存在了,但它也会留下空格。
在行 ptr[strlen(ptr)] = ' ';
中,您删除了字符串末尾的终止 NULL 字符,干扰了对 strlen()
和 strcat()
.
尝试用保存终止 NULL 的代码替换:
ptr[strlen(ptr)+1] = '[=10=]';
ptr[strlen(ptr)] = ' ';
或不调用 strlen()
两次的更优化版本:
int len = strlen(ptr);
ptr[len] = ' ';
ptr[len+1] = '[=11=]';