[英]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.