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

时间:2015-09-19 03:10:01

标签: c string pointers strcpy strcat

我有一个简单的程序,我正在尝试了解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,奇怪的字符不在那里,但它也会留下空格。

1 个答案:

答案 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';