下面是一個回傳字串指標的函式,這個函式是多型的,這意味著它可以回傳任何同學的名字。
const char* get_classmate_name(void)。
這里有一個任務,要求你將同學的資訊放入/取出每個同學檔案夾下的info.txt中,例如:
/good_class/Anderson/info.txt/
/good_class/Cindy/info.txt/ /good_class/Lily/info.txt/。
/good_class/Lily/info.txt/ /good_class/Lily/info.txt/。
我試圖用define macro來定義這些屬性:
顯然,第二個宏是錯誤的,因為它不允許通過使用##運算子來連接符號常量,在這種情況下,CLASS_PATH,與const char*連接。
我希望程式是簡單的,例如
static bool folder_is_found(constchar* folder_path)。
int main(void)
{
if ((!folder_is_found(CLASS_PATH)) || (!folder_is_found(CLASSMATE_PATH)))
{
reutrun -1;
}
const char* classmate_height = get_classmate_height(CLASSMATE_INFO_PATH)。
printf("classmate's height is :%s", classmate_height) 。
return 0。
}
如何正確定義CLASSMATE_PATH?
uj5u.com熱心網友回復:
你不能將CLASSMATE_PATH定義為一個宏,因為同學的名字(通過get_classmate_name()獲得)只在運行時知道,而不是在編譯時。
為了一次連接多個字串,你可能使用的函式是snprintf():
char* get_classmate_path(void){
const size_t max_path_size = 200;
char* res = malloc(max_path_size)。
if (res == NULL) {
return NULL。
}
int bytes = snprintf(res, max_path_size, "%s/%s"/span>, CLASS_PATH, get_classmate_name())。
if (bytes < 0 || (size_t) bytes >= max_path_size) {
free(res)。
return NULL。
}
return res;
}
int main(void) {
printf("Classmate path: %s
", get_classmate_path())。)
// POSSIBLE OUTPUT: 同學路徑。/good_class/Anderson
}
那么,將更多的字串串聯在一起是很簡單的:
char* get_classmate_info_path(void){
const size_t max_path_size = 200;
char* res = malloc(max_path_size)。
if (res == NULL) {
return NULL。
}
int bytes = snprintf(res, max_path_size, "%s/%s/info.txt", CLASS_PATH, get_classmate_name() 。)
if (bytes < 0 || (size_t) bytes >= max_path_size) {
free(res)。
return NULL。
}
return res;
注意:前面的例子使用了動態記憶體分配(通過malloc());你可能想詳細了解一下動態記憶體在C語言中的作業原理(例如,你應該在使用完get_classmate_path()的結果后呼叫free(),但這不屬于答案的范圍)。
注意2:前面的函式(get_classmate_path()和get_classmate_info_path())在出現錯誤時可能會回傳NULL。
uj5u.com熱心網友回復:
宏不是函式,即使有時它們看起來很相似。
宏不是函式。
- 宏是在C代碼編譯開始之前被評估的。前處理器對C語言一無所知。
##在預處理階段(即在C代碼編譯之前)將宏中的標記連接起來。##所做的事情與相鄰的字串字元的連接完全不同(兩者都必須是字串字元,并且連接發生在編譯時間,而不是運行時間)。
你需要使用函式而不是宏來實作你想要的東西。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/306953.html
標籤:
