[英]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];
}
現在想想上面循環中的5
和14
。
你有什么可以替代他們的? 當你回答這個問題時,你已經解決了你的編程問題:)
您無法安全地寫入這些數組,因為您還沒有確保有足夠的空間可用。 如果使用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()
一樣糟糕,因為它不支持限制輸出中使用的空間,它只是假設有足夠的可用空間。
問題:
length
不是一個功能。 strlen
是,但你可能不應該在循環中調用它 - b1
的長度不會改變我們,是嗎? 此外,它返回一個size_t
,它可能與您平台上的int
大小相同,但是將是無符號的。 這可能(但通常不會)導致錯誤,但無論如何都應該正確。 a1
只有足夠的空間容納第一個字符串,因為編譯器不知道為字符串的其余部分分配額外的堆棧空間。 如果您提供明確的大小,例如[100]
,那么這應該足以滿足您的需要。 如果您需要健壯的代碼,而不是對“足夠”的內容進行假設,那么您應該考慮malloc
和朋友,盡管這可能是另一天的教訓。 i < b1_len
(假設你有一個變量, b1_len
,在循環開始之前設置為b1
的長度)就足夠了 - strlen
不計算結尾的'\\0'
。 '\\0'
,在這種情況下,稍微更高效的實現可以使用sizeof a1 - 1
而不是strlen(a1)
,因為a1
(和b1
)被聲明為數組,而不是指針。 這是你的選擇,但請記住, sizeof
不適用於指針,所以不要混淆它們。 char *p = malloc(/*some*/); p = /* something */
char *p = malloc(/*some*/); p = /* something */
是一個問題。 =
使用指針不復制內容,它會復制該值,因此您將丟棄從malloc
獲得的舊指針值。 要將字符串的內容復制到char *
(或char []
),您需要使用strcpy
, strncpy
或(我的首選項) memcpy
。 (或者只是一個循環,但這是相當愚蠢的。再說一次,如果你正在編寫自己的strcat
,這可能是一個好習慣。) malloc
的返回值,但這是一場宗教戰爭,我們不需要其中一種。 如果你有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.