簡體   English   中英

C 指針問題連接字符串

[英]C Pointers Problem Concatenating Strings

我正在做一些練習,並試圖僅使用指針(無字符數組)連接兩個字符串。 我的代碼似乎可以編譯(注意:我使用的是舊的 16 位 Open Watcom 編譯器):

#include <stdio.h>

int main(){
  char *str1 = "first";
  char *str2 =" second";

  strcat2(str1,str2);

  for(;*str1!='\0';str1++){
      printf(str1);
  }

  return 0;
}

int strcat2(char *s,char *t){
  for(;*s!='\0';s++){
    ;
  }

  while((*s++ = *t++)!='\0'){
    ;
  }

  *t++;
  t='\0';

  return 0;
}

當我試圖運行它時,什么也沒有發生。 我確信我的上述工作存在嚴重缺陷。 任何建議和幫助將不勝感激。

您聲明的str1str2是字符串文字,無法修改。 在 linux 可執行文件中, str1str2指向的地址的內容存儲在不可寫的可執行文件的.rodata部分中。 在其他可執行文件中,內容存儲在不可寫的類似位置。 您應該使用數組或動態分配的 memory 區域來完成這項工作。 確保在連接要粘貼另一個字符串的字符串時有足夠的空間來容納它們。

編輯1:

要么做

char str1[BUFF_SIZ] = "Hello", str2[BUFF_SIZ] = " Man";
/* Now do strcat */ 
/* The strlen (str1) + strlen (str2) should be lessthan BUFF_SIZ */

或者

char *str1, *str2;
str1 = malloc (sizeof (char) * BUFF_SIZ);
str2 = malloc (sizeof (char) * BUFF_SIZ);
strcpy (str1, "Hello");
strcpy (str2, " Man");
/* Now do strcat */ 
/* The strlen (str1) + strlen (str2) should be lessthan BUFF_SIZ */

您的代碼將無法正常工作。 為了迂腐,它會調用未定義的行為,因為您正在嘗試修改字符串文字的內容。

char *str1 = "first";
char *str2 =" second";

str1指向位於 const memory 位置的“第一個”。

而不是擁有指向字符串文字的指針,您應該擁有一個具有足夠容量的字符數組,以便保存連接的字符串"firstsecond"

這按預期工作

#include <stdio.h>
int strcat2(char *s,char *t){    
   for(;*s!='\0';s++){
   }
   while((*s++ = *t++)!='\0'){        
   }
   t='\0';
   return 0;
}
int main(){
  char str1[15] = "first";
  char *str2 =" second";

  strcat2(str1,str2);
  printf("%s",str1);
  return 0;
}   

在線演示在這里

引用 man:strcat:

  char * strcat ( char * destination, const char * source );
  ...
  Parameters
  destination
  Pointer to the destination array, which should contain a C string, and be large enough to contain the concatenated resulting string.

您的目標字符串不夠

您需要一個可寫且足夠大的緩沖區來寫入,就像這樣

char str1[32] = "first";

暫無
暫無

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

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