我有一个简单的程序,我正在尝试了解strcat和strcpy。但是,它似乎没有正常工作。
似乎复制并追加就好了。但是,当我打印时,我认为它正在访问其范围之外的内存位置。
以下是代码:
secret_formula
如果我传递此字符串:my_outside_variable = my_function(value_going_into_function)
,则打印出来:
#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
中为arr [i]添加+1。但是,它仍会打印不在其中的字符。
如果我拿走这一行:O_O O_O hi o noe0x1828GFF2 ??32 ??t?32 ?̐?32 3 23 2 3
,奇怪的字符不在那里,但它也会留下空格。
答案 0 :(得分:1)
使用行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';