我有一個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 * string []聲明錯誤
- 3. (char **)(&samples)聲明瞭什麼?
- 4. 區分字符串聲明與char聲明
- 5. 聲明char數組中的Ruby FFI
- 6. 將shellcode聲明爲char []數組和char *之間的區別
- 7. 輸入一個char *聲明之前崩潰的程序,而這樣做到'只是聲明'char *不。爲什麼?
- 8. var聲明期望聲明
- 9. 如何在C中聲明大的2D char數組?
- 10. 當聲明char陣列時緩衝區溢出
- 11. 有條件地在二維char數組中聲明數組?
- 12. 將size_t轉換爲int來聲明char數組的大小
- 13. 如何在聲明中初始化char數組
- 14. 是否必須在聲明char const * ptr =「some characters」時使用'const'?
- 15. 如何在Visual Basic .NET中聲明Char文字?
- 16. 聲明從殼全局CHAR陣列用C
- 17. 如何正確聲明和初始化Char數組?
- 18. C++我不明白const char *和char *
- 19. 帶有512張到512個CSV的XLS
- 20. 1聲明多個變量的聲明,如聲明語句
- 21. Swift:儘管聲明已被聲明,但預期聲明爲
- 22. 聲明
- 23. 聲明
- 24. 聲明或不聲明在目標c
- 25. JS函數聲明:在參數聲明
- 26. '聲明-A X' VS '聲明-A X =()'
- 27. 「預期聲明」然後聲明
- 28. 「When」聲明與Java「switch」聲明
- 29. Python聲明變量vs不聲明
- 30. WHEN聲明後另一個當聲明
'strncpy'將無法正常工作,因爲您認爲它可以在此工作。如果輸入數組包含512個字符(或更長)的名稱,則最終將在輸出數組中包含一個未終止的字符串。另外,既然你做了typedef(「如果有疑問,請使用typedef」),在'new'中使用它也許是有意義的。 – AnT 2009-10-17 01:27:12
是的,'strncpy()'不會終止正好512個字符的目標字符串。 OP(以及他使用的API)可能假設不會達到這個最大值。但那是一個棘手的問題需要處理。 – 2009-10-26 22:06:49