我需要初始化一個固定大小的空字串陣列(例如,3乘100),將其傳遞給一個函式以填充資料,并對其執行strcpy()、strcmp()、memset()等操作。在該函式結束后,我需要能夠從我的main()中讀取資料。
到目前為止我所嘗試的是:
char arrayofstrings[3][100] = {0};
char (*pointer)[3][100] = & arrayofstrings;
function(pointer)。
初始化一個(空的)字串陣列,并在第一個元素上初始化一個指標。
int function (char (*pointer)[3][100])
{
strcpy((*pointer)[i], somepointertostring)。
strcmp((*pointer)[i], somepointertostring)
memset((*pointer)[i], 0, strlen((*pointer)[i])。
這是個好方法嗎?有什么更簡單的方法嗎?指標周圍的方括號是怎么回事?
uj5u.com熱心網友回復:
你不需要額外的指示級別。
一個陣列,當傳遞給一個函式時,會被轉換為一個指向其第一個成員的指標。 因此,如果你像這樣宣告函式:
一個陣列被傳遞給一個函式時,會被轉換為其第一個成員的指標。
int function(char (*pointer) [100])
或者等價地:
int function(char pointer[][100])
或者:
int function(char pointer[3][100])
你可以直接將陣列傳遞給函式:
function(arrayofstrings);
那么主體可以是這樣的:
strcpy(pointer[0], "some string") 。
strcpy(pointer[1], "some other string") 。
strcpy(pointer[2], " yet another string")。
uj5u.com熱心網友回復:
初始化字串陣列的最佳方法...
char arrayofstrings[3][100] = {0};對于初始化一個字串陣列來說是不錯的。
在C語言中,初始化只在物件定義時進行,如上圖。
后面的代碼,如strcpy(),分配資料到陣列。
最好的方法是......把它傳遞給一個函式
當C編譯器支持可變長度陣列時,使用
function(size_t n, size_t sz, char a[n][sz])。添加錯誤檢查。
使用
size_t來確定陣列的大小和索引。
int function(size_tn, size_t sz, char arrayofstrings[n][sz]) {
if (sz <= strlen(somepointertostring)) {
return 1;
}
for (size_t i = 0; i < n; i ) {
strcpy(arrayofstrings[i], somepointertostring)。
if (strcmp(arrayofstrings[i], somepointertostring) {
return 1;
}
//Drop this it see something interesting in `foo()`.
memset(arrayofstrings[i], 0, strlen(arrayofstrings[i]))。
}
return 0;
}
void foo(void) {
char arrayofstrings[3][100] = {0};
size_t n = sizeof arrayofstrings / sizeof arrayofstrings[0] 。
size_t sz = sizeof arrayofstrings[0] 。
if (function(n, sz, arrayofstrings)) {
puts("Fail"/span>)。
} else {
puts("Success") 。
puts(arrayofstrings[0])。
}
}
uj5u.com熱心網友回復:
對一個(空的?)字串陣列進行初始化,并在第一個元素上初始化一個指標。
&arrayofstrings的型別是char (*)[3][100],即指向一個物件的指標,這個物件是一個2D型別的char陣列,維度為3 x 100。所以,這個初始化
char (*pointer)[3][100] = &arrayofstrings;
不是用arrayofstrings陣列的第一個元素初始化pointer,而是pointer將指向整個2D陣列arrayofstrings。這就是為什么,當使用pointer訪問元素時,你需要在它周圍加上括號-
`(*pointer)[0]` -> first string
`(*pointer)[1]` -> 第二個字串等等。
這是個好方法嗎?是否有更簡單的方法?
如果你想要指向陣列arrayofstrings的第一個元素的指標,那么你可以這樣做
char (*p)[100] = & arrayofstrings[0] 。
或者
char (*p)[100] = arrayofstrings;
&arrayofstrings[0]和arrayofstrings都是等價的1)。
把它傳遞給一個函式,然后訪問陣列:
function()函式簽名應該是-
int function (char (*pointer) [100])
//如果你想讓函式知道行數,請為它添加一個引數 -。
//int function (char (*pointer)[100], int rows)
這等同于
int function (char pointer[][100])
并從main()函式中呼叫它,像這樣 -
function (p);
在function()函式中,你可以以p[0], p[1] ...的方式訪問陣列:
用于演示的示例程式:
#include <stdio.h>/span>
#include <string.h>
#define ROW 3
#define COL 100
void function (char (*p) [COL]) {
strcpy (p[0], "string one"/span>)。
strcpy (p[1], "string two") 。
strcpy (p[2], "string three");
}
int main(void) {
char arrayofstrings[ROW][COL] = {0};
char (*pointer)[COL] = &arrayofstrings[0] 。
函式(pointer)。
for (size_t i = 0; i < ROW; i) {
printf ("%s
", arrayofstrings[i])。)
}
return 0;
}
- 當你訪問一個陣列時,它被轉換為第一個元素的指標(有少數例外情況,這個規則)。
uj5u.com熱心網友回復:
C字串函式希望緩沖區是空尾的。你的arrayofstrings分配發生在堆疊中。根據你的編譯器,它可能被初始化為所有的零,也可能包含垃圾。
在你的情況下,確保字串函式不會溢位你的緩沖區的最簡單方法是將每個緩沖區的第一個字符設定為0(空)
arrayofstrings[0][0] =0x00。
arrayofstrings[1][0] = 0x00;
arrayofstrings[2][0] = 0x00。
這將給你3個,100個字符的緩沖區,包含一個有效的空 "字串"。注意,你只能存盤99個 "字符",因為最后一個字符必須是0x00(空結束符)。
char (*pointer)[3][100] = &arrayofstrings;
這是不需要的。
關于C語言中的陣列,需要記住的是,[]索引的存在實際上只是為了讓人類程式員的作業更輕松。任何陣列定義都只是一個指向記憶體的指標。[][]...[]索引內的值和型別被編譯器用來在堆疊中分配正確的記憶體量,并做一些簡單的數學計算,為你想要訪問的元素提供正確的記憶體地址。
char arrayofstrings[3][100] 。
這將在堆疊中分配sizeof(char)*3*100位元組,并給你一個名為'arrayofstrings'的char*。這個char*本身并沒有什么特別之處。如果你有char arrayofstrings[300]或者char arrayofstrings[3][10][10]甚至long arrayofstrings[75](char是1位元組,long是4位元組),它將是同一個指標。
因為你用[a][b]把它宣告為一個多維陣列,當你要求arrayofstrings[x][y]時,編譯器會計算((x*b) y)*sizeof(type)并把它加到arrayofstrings的指標上,得到你要的值的地址。但由于它只是一個指標,你可以像對待其他指標一樣對待它,并將它傳遞給其他型別的指標,或者用它做指標數學運算。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/322489.html
標籤:
上一篇:自我參考的結構宣告
