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 的話過載運算子是最優解 優雅 String s1 ABC s1 abc String s2 s1 DEF 熊起 imperfect C 裡有個兼顧效率和表達簡介的思路,脫去語法糖大體是這樣效果 int a,float b,char c stringbuilderproxy a b... 用 fgets 限定長度,保證輸入的記憶體安全 用 strtoint 簡單轉換。char str 50 fgets str,50 stdin strtoint 可以寫成過程,voidstrtoint char str int integer 如果使用 stdlib.h 的 atoi 對於太長的字串,... Lvcs 靈活接收資料型別,可以試試使用巨集定義而不用函式 舉個例子 判斷兩個數哪個大 define MAX a,b a b a b 使用巨集定義可以靈活接收各種型別的 a b,而使用函式判斷的話就需要事先設定傳入引數的型別了。 劉燦 傳遞指標同時提供區域長度 不用0來標識字串或區域結束 以typd...C C 語言中如何優雅地拼接多段字串?
C語言中怎樣最好地從標準輸入流中獲取字串,並轉換為int陣列?
在C語言中,如何安全地使用void ?