【问题标题】:C strcat/strcpy to character pointer not printing correctlyC strcat/strcpy 到字符指针未正确打印
【发布时间】:2015-12-16 07:06:54
【问题描述】:

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

【问题讨论】:

    标签: c string pointers strcpy strcat


    【解决方案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';
    

    【讨论】:

    • 谢谢!很有意义。您对更优化的版本有什么建议吗?我是 C 新手,不知道要寻找什么。
    猜你喜欢
    • 2014-08-06
    • 1970-01-01
    • 2018-06-10
    • 2023-03-15
    • 2018-09-25
    • 2018-05-08
    • 2016-01-21
    • 2016-03-14
    • 2018-02-17
    相关资源
    最近更新 更多