簡體   English   中英

字符串連接在C中沒有strcat

[英]String concatenation without strcat in C

我在C語言中連接字符串時遇到問題,沒有strcat庫函數。 這是我的代碼

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
  char *a1=(char*)malloc(100);
  strcpy(a1,"Vivek");
  char *b1=(char*)malloc(100);
  strcpy(b1,"Ratnavel");
  int i;
  int len=strlen(a1);

  for(i=0;i<strlen(b1);i++)
  {
     a1[i+len]=b1[i];
  }

  a1[i+len]='\0';                
  printf("\n\n A: %s",a1);

  return 0;
}

我對代碼進行了更正。 這很有效。 我現在可以不用strcpy嗎?

 char a1[] = "Vivek";

將創建一個大小為6的char數組a1 你試圖用更多的字符來填充它。

如果你想能夠容納連接"Vivek""Ratnavel"你需要一個大小至少為14 (5 + 8 + 1)的字符數組。

在您修改的程序中,您正在執行:

char *a1=(char*)malloc(100);  // 1
a1 = "Vivek";                 // 2

1:將分配一個大小為100字節的內存塊,使其指向a1
2:將a1指向字符串文字"Vivek" 無法修改此字符串文字。

要修復此問題,請使用strcpy將字符串復制到已分配的內存中:

char *a1=(char*)malloc(100);  
strcpy(a1,"Vivek");

for循環條件i<strlen(b1)-1也不會復制字符串中的最后一個字符,將其更改為i<strlen(b1)

a1[i]='\0';

應該

a1[i + len]='\0';

因為a1的新長度是i+len ,你需要在該索引處有NUL字符。

完成使用后,不要忘記free動態分配的內存。

下面的老答案


您可以使用strcpy初始化字符串,就像在代碼中一樣,或者直接在聲明char數組時。

char a1[100] = "Vivek";

除此之外,你可以做char-by-char

a1[0] = 'V';
a1[1] = 'i';
// ...
a1[4] = 'k';
a1[5] = '\0';

或者您可以編寫幾行代碼替換strcpy並使其成為函數或直接在main函數中使用。


老答案

你有

0 1 2 3 4 5 6 7 8 9 ...
    a1 [V|i|v|e|k|0|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_]
    b1 [R|a|t|n|a|v|e|l|0|_|_|_|_|_|_|_|_|_|_|_|_|_]

而你想要的

0 1 2 3 4 5 6 7 8 9 ...
    a1 [V|i|v|e|k|R|a|t|n|a|v|e|l|0|_|_|_|_|_|_|_|_]

所以......

a1[5] = 'R';
a1[6] = 'a';
// ...
a1[12] = 'l';
a1[13] = '\0';

但是有循環和東西,對嗎? :d

試試這個(記得添加缺失的位)

for (aindex = 5; aindex < 14; aindex++) {
    a1[aindex] = b1[aindex - 5];
}

現在想想上面循環中的514

你有什么可以替代他們的? 當你回答這個問題時,你已經解決了你的編程問題:)

您無法安全地寫入這些數組,因為您還沒有確保有足夠的空間可用。 如果使用malloc()來分配空間,則不能通過分配字符串文字來覆蓋指針。 在這種情況下,您需要使用strcpy()將字符串復制到新分配的緩沖區中。

此外,C中字符串的長度由strlen()函數計算,而不是您正在使用的length()

連接時,您需要在適當的位置終止,您的代碼似乎沒有這樣做。

這是我如何重新實現strcat() ,如果出於某種原因需要:

char * my_strcat(char *out, const char *in)
{
  char *anchor = out;
  size_t olen;

  if(out == NULL || in == NULL)
    return NULL;

  olen = strlen(out);
  out += olen;
  while(*out++ = *in++)
    ;
  return anchor;
}

請注意,當涉及緩沖區溢出時,這與strcat()一樣糟糕,因為它不支持限制輸出中使用的空間,它只是假設有足夠的可用空間。

問題:

  1. length不是一個功能。 strlen是,但你可能不應該在循環中調用它 - b1的長度不會改變我們,是嗎? 此外,它返回一個size_t ,它可能與您平台上的int大小相同,但是將是無符號的。 這可能(但通常不會)導致錯誤,但無論如何都應該正確。
  2. a1只有足夠的空間容納第一個字符串,因為編譯器不知道為字符串的其余部分分配額外的堆棧空間。 如果您提供明確的大小,例如[100] ,那么這應該足以滿足您的需要。 如果您需要健壯的代碼,而不是對“足夠”的內容進行假設,那么您應該考慮malloc和朋友,盡管這可能是另一天的教訓。
  3. 你的循環太早停止了。 i < b1_len (假設你有一個變量, b1_len ,在循環開始之前設置為b1的長度)就足夠了 - strlen不計算結尾的'\\0'
  4. 但是說到最后計算'\\0' ,在這種情況下,稍微更高效的實現可以使用sizeof a1 - 1而不是strlen(a1) ,因為a1 (和b1 )被聲明為數組,而不是指針。 這是你的選擇,但請記住, sizeof不適用於指針,所以不要混淆它們。
    編輯:新問題:
  5. char *p = malloc(/*some*/); p = /* something */ char *p = malloc(/*some*/); p = /* something */是一個問題。 =使用指針不復制內容,它會復制該值,因此您將丟棄從malloc獲得的舊指針值。 要將字符串的內容復制到char * (或char [] ),您需要使用strcpystrncpy或(我的首選項) memcpy (或者只是一個循環,但這是相當愚蠢的。再說一次,如果你正在編寫自己的strcat ,這可能是一個好習慣。)
  6. 除非你使用C ++,否則我不會轉換malloc的返回值,但這是一場宗教戰爭,我們不需要其中一種。
  7. 如果你有strdup ,請使用它。 如果你不這樣做,這是一個有效的實現:

     char *strdup(const char *c) { size_t l = strlen(c); char *d = malloc(l + 1); if(d) memcpy(d, c, l + 1); return d; } 

    它是C標准庫中最有用的功能之一。

你也可以使用strcpy()來做;)

char *a = (char *) malloc(100);
char *b = (char *) malloc(100);

strcpy(a, "abc");               // initializes a
strcpy(b, "def");               // and b

strcpy((a + strlen(a)), b);     // copy b at end of a

printf("%s\n",a);               // will produce: "abcdef"

我覺得這很簡單。

#include<stdio.h>
int xstrlen(char *);
void xstrcat(char *,char *,int);
void main()
{
    char source[]="Sarker";
    char target[30]="Maruf";
    int j=xstrlen(target);
    xstrcat(target,source,j);
    printf("Source String: %s\nTarget String: %s",source,target);
}
int xstrlen(char *s)
{
    int len=0;
    while(*s!='\0')
    {
        len++;
        s++;
    }
    return len;
}
void xstrcat(char *t,char *s,int j)
{
    while(*t!='\0')
    {
        *t=*t;
        t++;
    }
    while(*s!='\0')
    {
        *t=*s;
        s++;
        t++;
    }
}

最好將strcat邏輯分解為單獨的函數。 如果使用指針運算,則不需要strlen函數:

#include <stdio.h>
#include <stdlib.h>
#include <string.h> /* To completely get rid of this, 
                       implement your our strcpy as well */

static void 
my_strcat (char* dest, char* src)
{
  while (*dest) ++dest;
  while (*src) *(dest++) = *(src++);
  *dest = 0;
}

int 
main()
{
  char* a1 = malloc(100);
  char* b1 = malloc(100);

  strcpy (a1, "Vivek");  
  strcpy (b1, " Ratnavel");

  my_strcat (a1, b1);
  printf ("%s\n", a1); /* => Vivek Ratnavel */

  free (a1);
  free (b1);
  return 0;
}

暫無
暫無

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

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