C 語言中如何優雅地拼接多段字串?

時間 2021-05-31 18:42:56

1樓:湛藍水晶

用sprintf

strcat在設計之初是考慮了鏈式呼叫的,所以返回的是源位址,於是可以用

strcat

(strcat

(strcat

(strcat

(strcat

(strcat

(strcat

(strcat

(dest

,TEST1

),ip

),TEST2

),port

),TEST3

),name

),TEST4

),number);

2樓:ZXXX

使用C99的復合字面量配合巨集定義實現的

// 多個字串相加,返回新字串

#define stradd(...) _stradd(sizeof((char*))/sizeof(char*),(char*))

char

*_stradd

(size_t

argc

,char

**argv

)char

*dest

=malloc

(total_len

*sizeof

(char

));for

(size_ti=

0,offset=0

;i

;offset

+=len[i

],i++)

return

dest;}

然後就可以這麼寫了:

char

*dest

=stradd(ip

,port

,name

,number

);用完記得free

3樓:雪希年

首先,字串是人為定義的東西。

其實在C語言中你找不到一種叫做字串的資料型別,因為字串實際上是編譯器和程式設計師合作的產物。

要區分乙個字串,要麼靠邊界,要麼靠長度。

程式設計師定義了乙個字元陣列,用雙引號代表要賦值的內容為字串,然後編譯器自動加上字串結尾符0x00。

了解了這些,你就會知道,C語言天生就不可能有C++這麼優雅的字串拼接方法?

因為編譯器不支援。

更確切的說,是C的記憶體管理相對比較原始。

所以,你可以自己實現乙個StringContext,然後用自定義的函式來實現拼接,這可以讓你不採用strcat這種方式,也算是優雅了吧。

4樓:noname

// 如果都是literal string的話,改用#define然後連著寫就行了

#define ip "127.0.0.1"

#define port "3346"

#define name "jack"

#define number "123"

char

*combine=ip

port

name

number

;// Compile OK 逃……

5樓:Belleve

所以知道為什麼 Linux 那群人要寫乙個 asprintf 了吧。

實現可以是這樣:

intvasprintf

(char

**strp

,const

char

*fmt

,va_listap)

size_t

size=(

size_t

)len+1

;char

*str

=malloc

(size

);if(!

str)

// _vsprintf_s is the "secure" version of vsprintf

intr

=_vsprintf_s

(str

,len+1

,fmt,ap

);if(r

==-1)

*strp

=str

;returnr;

}int

asprintf

(char

**strp

,const

char

*fmt

,...)

6樓:luikore

你們都不知道 sprintf 可以用 "%.*s" 設定長度的咩, 這樣就不怕帶 \0 的溢位了

sprintf

(des

,"%.*s %.*s %.*s",3

,"foo",3

,"bar",3

,"baz");

7樓:謝勇

char des[1000];

sprintf(des,"%s%s%s","hello","world","C Programming Language");

8樓:Xi Yang

用malloc分配一塊記憶體不就完了,然後直接把內容拷貝過去。C++ string的實現內部也需要做類似的事情。

自己寫成函式,做成乙個庫,方便重用。

char* concat_multi_string(int num_string, ...);

9樓:riteme

改一改,有些看起來優雅的方法了。

如果你用的是gcc,那麼你可以用乙個擴充套件函式asprintf。

它會自動分配足夠長的陣列來給你存放,只要記得free就不會有問題(不過好像很容易忘記...)。用法很簡單:

char *str;

asprintf(&str,"%s%s%s%s",s1,s2,s3,s4);

//After using str...

free(str);

跟printf用法一致。

如果你用的不是gcc,可能需要使用兩次sprintf,第一次指定輸出為NULL然後獲得返回值,加上1(結尾有個\0),然後動態分配陣列,再用sprintf來拼接。

如果是MSVC好像用的是_sprintf,與sprintf還有些區別...

但是為了追求優雅,一上方法的效能都不太高...

所以估計得有點取捨...

10樓:夏雨婷

#include

#include

#include

#include

static

size_t

strcat2

(char

**dst_out

,...)

va_end

(argp

);if

(len==0

)return0;

dst=

(char*)

malloc

(sizeof

(char)*

(len+1

));if

(dst

==NULL

)return-1

;dst_p

=dst

;va_start

(argp

,dst_out

);for

(;;)

va_end

(argp);*

dst_p

='\0';*

dst_out

=dst

;return

len;

}int

main

(void

)C語言陷阱很多,寫對就已經非常困難,別追求「最少語句」。

常用功能封裝成庫。

C C 語言中如何優雅地拼接多段字串?

熊貓刷牙 如果是C 的話過載運算子是最優解 優雅 String s1 ABC s1 abc String s2 s1 DEF 熊起 imperfect C 裡有個兼顧效率和表達簡介的思路,脫去語法糖大體是這樣效果 int a,float b,char c stringbuilderproxy a b...

C語言中怎樣最好地從標準輸入流中獲取字串,並轉換為int陣列?

用 fgets 限定長度,保證輸入的記憶體安全 用 strtoint 簡單轉換。char str 50 fgets str,50 stdin strtoint 可以寫成過程,voidstrtoint char str int integer 如果使用 stdlib.h 的 atoi 對於太長的字串,...

在C語言中,如何安全地使用void ?

Lvcs 靈活接收資料型別,可以試試使用巨集定義而不用函式 舉個例子 判斷兩個數哪個大 define MAX a,b a b a b 使用巨集定義可以靈活接收各種型別的 a b,而使用函式判斷的話就需要事先設定傳入引數的型別了。 劉燦 傳遞指標同時提供區域長度 不用0來標識字串或區域結束 以typd...