2016-01-07 88 views
1

在C#中的數組,如果我要創建的字符串數組的數組,很容易因爲這樣做:字符串[,]字符串數組相當於用C

​​

我怎麼會去這樣做,在C?我明白我應該使用指針,但是我提出的似乎並不正確。

char *array[50][7]; 

請注意,我不希望設置元素爲恆定值,我需要能夠訪問它們/重新設置在程序或者通過使用scanf()功能或只是=手段如果可能的話。實現這個最簡單的方法是什麼?

編輯:我在這裏做錯了什麼?下面很簡單的例子崩潰該程序:

char *username; 

printf("Username: "); 
scanf("%s", &username); 

array[0][0] = malloc(strlen(username) + 1); 
strcpy(array[0][0], username); 

我有,實際上,加到stdlib.h

+0

@Sinatr'串[,]'是矩形陣列,而不是鋸齒狀的。 –

+0

你可以創建一個'std:string'的二維數組。 –

+1

@MthetheWWatson它不會在C. –

回答

1

下面的代碼崩潰的代碼試圖保存scanf()輸入的地方通過username指出,但username未初始化。

char *username; 
scanf("%s", &username); // bad 

相反,可以使用

char username[100]; 
scanf("%99s", username); 

或者更好

char username[100]; 
fgets(username, sizeof username, stdin); 
username[strcspn(username, "\n")] = '\0'; // lop off potential \n 

它出現OP想要一個50×7指針數組來分配,如C字符串string[,] array = new string[50,7];

召回在C,一個字符串本身就是一個字符數組以空字符

#include <stdlib.h> 
typedef char *a50_7_T[50][7]; 

a50_7_T *a50_7_alloc(void) { 
    a50_7_T *a = malloc(sizeof *a); 
    for (int i=0; i<50; i++) { 
    for (int j=0; j<7; j++) { 
     (*a)[i][j] = NULL; // or whatever OP wants as initial state 
    } 
    } 
    return a; 
} 

void a50_7_free(a50_7_T *a) { 
    for (int i=0; i<50; i++) { 
    for (int j=0; j<7; j++) { 
     free((*a)[i][j]); 
    } 
    } 
    free(a); 
} 

// Sample usage code 
#include <string.h> 
void foo(void) { 
    a50_7_T *a = a50_7_alloc(); 
    printf("Size %zu\n", sizeof *a); // e.g. "Size 1400" 
    (*a)[0][0] = strcpy(malloc(6), "Hello"); 
    a50_7_free(a); 
} 

OTOH結束,如果OP要創建數組作爲聲明的一部分,也就是在正確的軌道上什麼OP。

//     Initialize all to zeros, (NULL) 
char *array[50][7] = { 0 }; 
... 
array[0][0] = strcpy(malloc(6), "Hello"); 
... 
free(array[0][0]); 
1

基準的陣列是確定爲。問題可能來自字符串。 C'字符串'的級別非常低,並且不能與C#字符串進行比較。你將不得不爲他們手動分配和釋放空間。如果你打算在它們上使用scanf,你可以爲每個緩衝區分配一個緩衝區,但是如果你發現一個比緩衝區長的字符串,你會遇到問題。您可以爲它們分配'=',但只有在您處理舊值的重新分配時。也許你可以檢查一個庫,比如'glib'爲你做一些工作。

+0

要清楚地說明:C沒有字符串類型。這都是慣例。 – Olaf

+0

代碼不能「你可以給它們分配'=',」。在C中,_string_是一個數組,數組的賦值不存在。 – chux

+0

@chux你錯了。如果你聲明:'char * x [10] [10]'你可以做'x [0] [0] = malloc(...);'或者其他。 –

3

有沒有簡單的方法:)由於C沒有高級別的字符串類,至少不是沒有調用一些非標準的庫。

爲了靈活起見,您確實需要一個二維數組指針char *array[50][7];,其中每個指針都設置爲指向實際字符串。在創建一個字符串時,你將不得不分配足夠的內存來存放它,加上空終止符,通過使用malloc()。例如:

array[x][y] = malloc(strlen(the_string) + 1); 
assert(array[x][y] != NULL); 

這是不可能在C複製字符串與=賦值運算符,所以分配內存後,您必須使用strcpy字符串複製到分配的內存區域。

strcpy(array[x][y], the_string); 
+0

你的答案似乎是最有用的,但我無法讓它工作。在OP中查看我的編輯。 –

+0

@JimIliadis你必須先分配內存,然後再在這個地址存儲東西... – Lundin

0

好了,你必須決定兩件事情,其中​​C#根本不給你一個選擇(或者至少,標準之一是非常強烈推薦):

  1. 怎麼辦你想表示你的二維數組?

    你必須之間的選擇,等等,

    • 一維陣列和明確的指針的算術,
    • 指向與一個固定維數的2維陣列,
    • 一個指向一維數組指針的指針。
  2. 你想如何表示你的字符串?

    • 決定的代碼單元上:char(希望8位),wchar16_twchar32_twchar_t
    • 計數字符串還是以0結尾的?
    • 在一個固定大小的緩衝區或動態分配?