簡體   English   中英

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] = '\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]);中將+1加到arr [i] strcat(ptr, arr[i]); 但是,它仍會打印不存在的字符。

如果我刪除這一行: 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';

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM