我有一個C++ SDK,需要一個char [] [512]作爲參數。我知道這應該是一個文件名列表和文件數量可能會有所不同。對於我的生活,我無法弄清楚如何聲明這一點。我有一個CString的數組,我試圖使用strcpy_s複製它們,然後將它們傳遞給SDK。任何想法如何做到這一點?聲明char [] [512]?
1
A
回答
4
該聲明在用於聲明函數參數時有特殊含義。在參數列表中,它相當於char[100][512]
,char[123][512]
,char[3][512]
(您會明白 - 第一個大小可以是任何東西,它會被忽略),也可以是char (*)[512]
。實際上,它將接受一個靈活(任意)第一大小的二維字符數組作爲參數。
,你會真正傳遞給這個函數的數組應該用具體的第一大小聲明,例如
char names[3][512] = { "abc", "cde", "fgh" };
如果你當然知道在編譯時的第一大小。
如果第一大小是在運行時(比如,n
)只知道,你就必須動態地
char (*names)[512] = new char[n][512];
// Now fill it with names
,或者更優雅分配陣列,用一個typedef
typedef char TName[512];
TName* names = new TName[n];
// Now fill it with names
我期望您所說的SDK函數也會要求您將名稱數組的第一個大小作爲另一個參數傳遞。
2
這意味着字符的二維數組。行數可能有所不同,應該/可以在另一個參數中指定。 C/C++編譯器在傳遞二維數組時需要知道數列,所以他們可以構建映射函數。僅僅因爲數組在參數傳遞時衰減爲指針,大小信息就會丟失。例如:
void fun(char matrix[][512], int rows);
...
char matrix[100][512];
...
fun(matrix, 100);
映射函數,該編譯器構建的2D陣列是類似於:
// arrays in C/C++ are stored in Row-Major Order
matrix[i][j] == matrix[i*numberOfColumns + j]
正如你可以看到,當2D陣列被傳遞和大小的信息丟失,我們只需要列數來索引此數組中的任何元素。
1
以下是將文件名稱風格的轉換爲SDK所需格式的一種方法。
typedef char Char512[512];
Char512 * convert(const char *names[], int n)
{
Char512 * arr;
arr = new char[n][512];
for (int i = 0; i < n; n++)
::strncpy(arr[i], names[i], 512);
return arr;
}
如果有疑問,請使用typedef。
1
只是提醒一下,如果你new[]
的東西,你必須delete[]
(而不是delete
)它有時。
相關問題
- 1. 類型聲明錯誤:[Char]和[[Char]]
- 2. (char **)(&samples)聲明瞭什麼?
- 3. Char * string []聲明錯誤
- 4. C-聲明char數組
- 5. C函數聲明'void msgBox(const char *,const char *)'與前面的聲明衝突
- 6. 如何聲明已在類中聲明的char變量的char數組?
- 7. 「bad expression」聲明char數組c
- 8. 區分字符串聲明與char聲明
- 9. 聲明char數組中的Ruby FFI
- 10. 什麼是arduino中的char *聲明?
- 11. 在聲明時初始化char數組?
- 12. 如何解釋聲明char * x [5]?
- 13. C++ - '(const char *)'未在範圍內聲明?
- 14. 將shellcode聲明爲char []數組和char *之間的區別
- 15. 當在struct中聲明時,char []和char *有什麼區別?
- 16. 輸入一個char *聲明之前崩潰的程序,而這樣做到'只是聲明'char *不。爲什麼?
- 17. 這是可能的聲明可以存儲超過512個字符
- 18. 在傳遞char * argv []和聲明char * argv之間有什麼不同?
- 19. var聲明期望聲明
- 20. handlebars.js - 聲明是否聲明
- 21. 在C++中聲明char十六進制常量11
- 22. 如何在聲明後設置一個const char *?
- 23. 如何在Visual Basic .NET中聲明Char文字?
- 24. 是否必須在聲明char const * ptr =「some characters」時使用'const'?
- 25. 將size_t轉換爲int來聲明char數組的大小
- 26. 聲明從殼全局CHAR陣列用C
- 27. 如何在C中聲明大的2D char數組?
- 28. 使用一個char **的項目(後聲明後初始化)
- 29. 有條件地在二維char數組中聲明數組?
- 30. 如何正確聲明和初始化Char數組?
'strncpy'將無法正常工作,因爲您認爲它可以在此工作。如果輸入數組包含512個字符(或更長)的名稱,則最終將在輸出數組中包含一個未終止的字符串。另外,既然你做了typedef(「如果有疑問,請使用typedef」),在'new'中使用它也許是有意義的。 – AnT 2009-10-17 01:27:12
是的,'strncpy()'不會終止正好512個字符的目標字符串。 OP(以及他使用的API)可能假設不會達到這個最大值。但那是一個棘手的問題需要處理。 – 2009-10-26 22:06:49