2016-04-22 542 views
-1

通常,我們可以在printf(),fprintf()函數中使用佔位符%s。如何在c中使用佔位符(%s)創建字符串

我想用佔位符來創建一個使用%s的字符串。這樣

char fName[200] = "C:\\Users\\%s\\Desktop\\Result", getenv("USERNAME"); 

// getenv() function will return current user name 

// The fName will be "C:\\Users\\Zobayer\\Desktop\\Result" 

我知道在C++中,我們可以通過字符串流

std::stringstream ss; 
ss << "C:\\Users\\" << getenv("USERNAME") << "\\Desktop\\Result"; 

但在C創建它如何建立這種類型的字符串?請幫幫我。

並提前感謝我。

+6

'char fName [200]; snprintf(fName,sizeof(fName),「C:\\ Users \\%s \\ Desktop \\ Result」,getenv(「USERNAME」));' – BLUEPIXY

+0

您需要使用['snprintf'](http:/ /en.cppreference.com/w/c/io/fprintf)。 –

+1

@BLUEPIXY,除非我們可以找到重複,否則該評論值得推薦給答案。 –

回答

0

嘗試用sprintf。它會打印到一個字符串。

char fName[200]; 
sprintf(fName, "C:\\Users\\%s\\Desktop\\Result", getenv("USERNAME")); 
+1

更好地使用'snprintf',而不是'sprintf'。這可能溢出。 – Leandros

+0

@Leandros使用'snprintf()'而不檢查其結果並不比'sprintf()'更好 - 只是將一組問題換成另一組問題。強大的代碼將根據需要檢查'getenv()'的結果,並檢查'fName []'的大小。 – chux

+0

@chux絕對如此。 – Leandros

0

如果可以,請使用snprintf而不是sprintf。它會防止可能的緩衝區溢出。

char fName[200]; 
snprintf(fName, sizeof(fName), "C:\\Users\\%s\\Desktop\\Result", getenv("USERNAME")); 
0

在C中,代碼需要處理結果字符串的內存分配。許多方法。

// char fName[200] = "C:\\Users\\%s\\Desktop\\Result", getenv("USERNAME"); 

char *username = getenv("USERNAME"); 

// Insure a valid name was found 
if (username == NULL) { 
    Handle_NoUsername(); 
} 

// Allocate enough space for the answer 
const char *format = "C:\\Users\\%s\\Desktop\\Result"; 
size_t size = strlen(format) + strlen(username) + 1; // slight over-sized 
char *fName = malloc(size); 
if (fname == NULL) { 
    Handle_OOM(); // Out-of-memory 
} 

int n = snprintf(fName, size, format, username); 
if (n < 0 || n >= size) { 
    Handle_UnusualPrintProblem(); 
} 

// use fName 

free(fName);