2011-09-28 120 views
2

與字符的字符串數組。當我這樣做C語言創建

char *paths[10]; 
paths[0] = "123456"; 

printf(1,"%s\n",paths[0]); 
printf(1,"%c\n",paths[0][2]); 

輸出:

123456 
3 

但是,當我這樣做

char *paths[10]; 
paths[0][0]='1'; 
paths[0][1]='2'; 
paths[0][2]='3'; 
paths[0][3]='4'; 
paths[0][4]='5'; 
paths[0][5]='6'; 
printf(1,"%s\n",paths[0]); 
printf(1,"%c\n",paths[0][2]); 

輸出:

(null) 
3 

爲什麼在這種情況下爲空?
如何使用C中的字符創建一個字符串數組?我對C有點新,並且在編程時感到有些困難C

回答

2
char *paths[10]; 
paths[0][0]='1'; 

paths是一個指針數組。 paths未初始化爲任何內容。所以它有垃圾值。您需要使用malloc分配內存。你只是不幸的是,這個程序實際上默默無聞地工作着。想想paths[0][0]會給它分配的地址位置。

在另一方面,這個工作,因爲 -

char *paths[10]; 
paths[0] = "123456"; 

"123456"是一個字符串居住在僅讀取位置。因此,它返回paths[0]所在位置的起始地址。要正確聲明 -

const char* paths[10]; 
+0

我幾乎是C的新手,你能幫我用字符創建一個字符串數組嗎?正如我在第二個例子中所做的那樣? – SMUsamaShah

+0

請理解@Matthew的帖子。很明顯。 – Mahesh

+0

相反,我明白你的觀點。當我做'路徑[0] =「123456」;'它會自動初始化爲它的長度(6)。但是,當我做'路徑[0] [0]'它不知道數組的第二維的大小。正確? – SMUsamaShah

2

paths是一個指向char的10個指針的數組。但是,最初的元素是無法解除引用的指針。這些是​​(對於函數中的數組)或對於靜態數組爲NULL。野指針是一個未初始化的指針。

我想你的是靜態的,因爲paths[0]NULL。但是,這可能是巧合。

當您取消引用NULL或未初始化的指針時,您正在讀取或寫入您不屬於自己的內存。這會導致未定義的行爲,這可能會導致程序崩潰。

你真的很幸運,它不會崩潰。這可能是因爲編譯器看到你正在寫一個常量到paths[0][2],並將你的printf改爲直接打印常量。你可以不是依靠這個。

如果你想擁有你可以寫一個指針,這樣做:

paths[0] = malloc(string_length + 1); 

string_length是你可以寫的字符數。 1給你一個NUL的空間。當你完成後,你必須free它。

1

對於第二個示例,如果知道每個字符串的大小,您可以編寫例如

char paths[10][6]; 
paths[0][0]='1'; 

...

paths[0][5]='6'; 

這種方式,你有長度爲6的10串(只使用第一個字符串到目前爲止)。

+2

你應該有值只有'paths [0] [4]','路徑[0] [5]'應該是NUL字符 –

4

你有很多選擇提供的各種答案,我只是加了幾個點。 您可以創建一個字符串數組如下:
一,您可以按如下方式創建只讀字符串數組:

char *string_array0[] = {"Hello", "World", "!" }; 

這將創建3 陣列只讀字符串。在這種情況下,您不能修改字符串的字符,即string_array0[0][0]='R';非法
二,您可以根據需要聲明指針數組&。

char *string_array1[2]; /* Array of pointers */ 
string_array1[0] = "Hey there"; /* This creates a read-only string */ 
/* string_array1[0][0] = 'R';*/ /* This is illegal, don't do this */ 
string_array1[1] = malloc(3); /* Allocate memory for 2 character string + 1 NULL char*/ 
if(NULL == string_array1[1]) 
{ 
/* Handle memory allocation failure*/ 
} 

string_array1[1][0] = 'H'; 
string_array1[1][1] = 'i'; 
string_array1[1][2] = '\0'; /* This is important. You can use 0 or NULL as well*/ 
... 
/* Use string_array1*/ 
... 
free(string_array1[1]); /* Don't forget to free memory after usage */ 

三,你可以聲明一個二維字符數組。

char string_array2[2][4]; /* 2 strings of atmost 3 characters can be stored */ 
string_array2[0][0] = 'O'; 
string_array2[0][1] = 'l'; 
string_array2[0][2] = 'a'; 
string_array2[0][3] = '\0'; 

string_array2[1][0] = 'H'; 
string_array2[1][1] = 'i'; 
string_array2[1][2] = '\0'; /* NUL terminated, thus string of length of 2 */ 

四,你可以使用指向指針的指針。

char ** string_array3; 
int i; 
string_array3 = malloc(2*sizeof(char*)); /* 2 strings */ 
if(NULL == string_array3) 
{ 
     /* Memory allocation failure handling*/ 
} 

for(i = 0; i < 2; i++) 
{ 
    string_array3[i] = malloc(3); /* String can hold at most 2 characters */ 
    if(NULL == string_array3[i]) 
    { 
     /* Memory allocation failure handling*/ 
    } 
} 

strcpy(string_array3[0], "Hi"); 

string_array3[1][0]='I'; 
string_array3[1][1]='T'; 
string_array3[1][2]='\0'; 

/*Use string_array3*/ 

for(i = 0; i < 2; i++) 
{ 
    free(string_array3[i]); 
} 

free(string_array3); 

要記住的要點:

  • 如果要創建只讀的字符串,你不能在字符串中更改字符 。

  • 如果您填寫的字符數組,請確保您有 內存來容納NULL字符&確保您有NULL字符終止您 字符串數據。

  • 如果您正在使用指針& 分配內存,請務必檢查,如果內存分配使用後正確進行 &釋放內存。
  • 使用字符串函數 string.h進行字符串操作。

希望這有助於!
P.S.:printf(1,"%s\n",paths[0]);看起來黑幕

+0

問題是,我沒有完整的字符串或其長度存儲在數組中。所以我必須按字符存儲它。非常詳細的答案感謝。 – SMUsamaShah

+0

@ LifeH2O:在這種情況下,使用指針數組&malloc。如果你不確定字符串的數量,還有另一種選擇。使用指針指針。你知道使用時的字符串數量嗎? –

+0

不,我實際上是通過檢查分隔符來解析一個文件並將其存儲在數組中(預定義的大小)。 – SMUsamaShah

0

你可以自己定義字符串,後

#inlcude <stdio.h> 

這樣

typedef char string[]; 

權利,在主,你能做到這一點

string paths = "123456"; 
printf("%s\n", paths); 
return 0; 

因此您的代碼看起來像這樣

#include <stdio.h> 
typedef char string[]; 

int main() { 
    string paths = "123456"; 
    printf("%s", paths); 
}