2012-10-18 95 views
0

因爲我對C編程非常陌生,所以我可能有一個非常簡單的問題。C:創建字符串中存在的字符和字符

我有一個結構看起來像這樣

typedef struct Vector{ 
    int a; 
    int b; 
    int c; 
}Vector; 

現在我想寫向量的文件的數組。爲了實現這一目標,我想創建這樣的方法方案

String createVectorString(Vector vec){ 
    // (1) 
} 

String createVectorArrayString(Vector arr[]){ 
    int i; 
    String arrayString; 
    for(i=0; i<sizeof(arr); i++){ 
     //append createVectorString(arr[i]) to arrayString (2) 
    } 
} 

void writeInFile(Vector arr[]){ 
    FILE *file; 
    file = fopen("sorted_vectors.txt", "a+"); 
    fprintf(file, "%s", createVectorArrayString(arr); 
    fclose(file); 
} 

int main(void){ 

    // create here my array of Vectors (this has already been made and is not part of the question) 
    // then call writeInFile 

    return 0; 
} 

我的主要問題是在(1),其中涉及還(2)(因爲我不知道如何用繩子在C工作,日食說「類型」字符串「未知」,雖然我包括<string.h>

所以我在某些時候讀到的一點是,可以用itoa()方法將int轉換爲字符串。 正如我的理解是,我可以簡單地做以下

char buf[33]; 
int a = 5; 
itoa(a, buf, 10) 

但是,我不能把那個工作,更何況,我無法弄清楚如何「粘貼」 char S或int s轉換爲字符串。

在我的觀點(1),我想創建表單(a,b,c),其中爲a,b和c是我的結構向量的「場」的字符串。

在點(2),我想創建表單(a1,b1,c1)\n(a2,b2,c2)\n...(an,bn,cn),其中n是向量的陣列中的量的一個字符串。

是否有快速解決方案?我是否將Java的Strings概念與C的概念混爲一談?

+0

如果您包含''(小寫's'),它提供了一些用於處理C字符串的函數,它們是以0結尾的char字符串。在標準C中沒有'String'(或'string')類型。如果'String.h'是你的項目中定義'String'類型的頭文件,那麼我們需要了解這個錯誤。 –

+3

你誤會了sizeof。 'sizeof arr'不會達到你所期望的。 – wildplasser

+0

這是一個錯字,糾正了問題 –

回答

4

是的,你這樣做混淆Java和C.

字符串的C字符串是相當不方便與之合作的概念。它們需要動態內存分配,更糟糕的是,相應的釋放(這可能很乏味)。在你的情況下,最好是完全刪除字符串,並且在沒有字符串的情況下實現你需要的任何東西。

直接寫入一個矢量到文件:

要寫入向量的陣列,只是做上述在一個循環。

1

簡而言之:是的,您將Java字符串與C混淆,您沒有標準字符串類型。什麼是字符串實際上是一個字符序列,字符值爲0(或'\ 0',如果你想純化)。

最快的解決方案是不生成字符串(並手動分配所有內存),而是使用fprintfFILE*。除了創建字符串的函數之外,還可以編寫函數將各種信息寫入FILE*,例如int writeVector(FILE* output, Vector v)。開始時會更容易。我認爲構建這樣的字符串所需的所有手動內存管理的所有細節都是不錯的開始。 (注意在提出的原型中int的返回類型;這是針對錯誤代碼的。)

此外,正如其中一位評論者指出的,您誤解了sizeof。 sizeof(arr)會返回數組中所有元素的大小,以字節爲單位(好吧,從技術上講是字符,但這是一個你現在不需要擔心的區別)。要獲取數組中的元素數,您需要使用sizeof(arr)/sizeof(arr[0])。但我不確定它是否適用於你的函數參數,這在技術上是一個指針,儘管花哨的語法。將sizeof應用於指針將返回指針本身的大小,而不是它指向的數據。

這就是爲什麼用C你通常會在一個額外的函數參數提供了數組的大小,如:

String createVectorArrayString(Vector arr[], size_t n)

或更符合我上面寫道:

int writeVectorArray(FILE *output, Vector arr[], size_t n) 
{ 
    int retcode = 0; 
    size_t i; 
    for (i = 0; i < n; ++i) { 
    if ((retcode = writeVector(output, arr[i])) != 0) 
     return retcode; 
    } 
} 
1

是的,你混淆Java字符串與C.

  1. 你不能在C中傳遞數組,只有指向第一個元素的指針。
  2. sizeof (arr)其中arr是一個函數參數,是指針的大小。
  3. 你不能返回一個塊範圍字符串,只有一個指向字符串的指針。但是當函數返回時,指向本地自動變量的指針超出了範圍。

我寫一個循環沿着

#define N 42 

/* Typedef for Vector assumed somewhere.*/ 
Vector arr[N]; 
/* Fill arr[]. */ 

for (i = 0; i < N; ++i) { 
    fprintf (file, "arr[%d] = { a=%d, b=%d, c=%d }\n", i, arr[i].a, arr[i].b, arr[i].c); 
} 
2

的字符串更多,在C,只是字符的空終止陣列。它通常聲明爲char *,但如果您有一個固定的最大長度,並且可以將其分配到堆棧或在結構中內聯,則可能會聲明爲char str[LENGTH]

從字符和數字組合中構建字符串的最簡單方法之一是使用snprintf()。這與printf()類似,但不是打印到標準輸出,而是打印成一個字符串(數組爲char)。請注意,您需要自行分配並傳入緩衝區;因此您需要事先知道最大長度,或者通過嘗試呼叫snprintf(),找出要打印的字符數,分配該大小的數組並再次調用snprintf()以實際打印結果。

所以,如果你有三個整數的向量,並希望建立一個串出來的,你可以寫:

char *createVectorString(Vector vec){ 
    int count = snprintf(NULL, 0, "(%d,%d,%d)", vec.a, vec.b, vec.c); 
    if (count < 0) 
     return NULL; 
    char *result = malloc(count * sizeof(char)); 
    if (result == NULL) 
     return NULL; 
    count = snprintf(result, count, "(%d,%d,%d)", vec.a, vec.b, vec.c); 
    if (count < 0) 
     return NULL; 
    return result; 
} 

需要注意的是,因爲你叫malloc()分配該緩衝區,您需要一旦你完成它,請撥打free(),以避免內存泄漏。

請注意,snprintf()只返回您需要從C99開始的長度。一些編譯器(如MSVC)不支持C99,所以它們返回-1而不是字符串的長度。在這些情況下,可能會有另一個函數可以調用以確定需要的緩衝區的大小(在MSVC中,它的格式爲_vscprintf),或者您可能需要猜測大小,如果不起作用,則分配一個緩衝兩倍的大小,然後再試一次,直到成功。

相關問題