2015-12-18 91 views
1

如何分配初始內存,並增加每個用戶輸入的內存,以獲取已知列數的字符串數組。例如: :`char * type [20]; 我想爲它分配初始內存並增加每個scanf(「%s」,類型[i])的空間;這是在循環中。 你能否請我幫我字符串數組的分配內存

+1

提示:動態內存和'realloc'。 – emlai

+1

我剛剛回答了[與此非常相似的問題](http://stackoverflow.com/questions/34353204/how-do-i-make-this-function-take-arbitrary-strings),並愉快地(爲你)爲您的問題提供了完整的解決方案。 –

回答

0

數組是一個連續的內存塊,當你聲明一個特定類型的數組時,你不能再增大或減小它的大小。

一個辦法是爲你申報焦炭的合理的大尺寸數組來保存你的「弦」。像這樣:

const int size=256; 
char input[size]; //declares an array of 256 chars 

爲在焦炭的arary輸入實際的「串」,你可以使用scanf函數,但我建議你用fgets,因爲它是更安全。

while(fgets(input, size, stdin)!=NULL) 
{ 
    //do something with input 
} 

這種做法容易受到緩衝區溢出不一定是安全的,但通常的做法仍然

爲你們的問題「字符串數組」,要動態地分配一切。 (如果您動態分配一個char **,使其指向堆棧分配的char []你所要求的大的時間麻煩)

你應該使用一個默認的大小爲您的char **(說參加1000字符* )併爲每個char *使用默認分配大小,例如256 * sizeof(char)字節。

這種方式,你可以使用realloc的每次用盡你的時空。

0

每次需要讀取新字符串時,都可以使用在標頭<stdlib.h>中聲明的標準函數realloc

這裏一個示範程序,而不是讀取字符串只是複製他們

#include <stdlib.h> 
#include <string.h> 
#include <stdio.h> 

int main(void) 
{ 

    char (*s)[20] = NULL; 
    char (*p)[20] = NULL; 
    size_t n = 0; 

    do 
    { 
     p = realloc(s, (n + 1) * sizeof(*s)); 

     if (p) 
     { 
      s = p; 
      strcpy(s[n], (char[]){ 'A' + n, '\0'}); 
      ++n; 
     } 
    } while (p && n < 10); 

    for (size_t i = 0; i < n; i++ ) puts(s[i]); 


    free(s); 
} 

固定數量的程序輸出是

A 
B 
C 
D 
E 
F 
G 
H 
I 
J 

注重功能如何realloc使用。

如果知道串的個數不能小於某個常數,那麼您可以最初分配動態等於這個恆定大小的陣列。

例如

#define MIN_SIZE 10 

//... 

char (*s)[20] = malloc(MIN_SIZE * sizeof(*s)); 
+0

你說得對,我是在錯誤的地方從手機上打字。無論如何,原創作者編輯嗨的答案同時。對於那個很抱歉 :)) – Michi

1

您可以使用動態分配的內存是

char *read_string(void) 
{ 
     int c; 
     int i = 0; 
     char *s = malloc(1); 
     printf("Enter a string: \t"); // It can be of any length 
     /* Read characters until found an EOF or newline character. */ 
     while((c = getchar()) != '\n' && c != EOF) 
     { 
      s[i++] = c; 
      s = realloc(s, i+1); // Add memory space for another character to be read. 
     } 
     s[i] = '\0'; // Nul terminate the string 
     return s; 
} 

int main(void) 
{ 
    char* type[20]; 
    for(size_t i = 0; i < sizeof(type); i++) 
     type[i] = read_string(); 
    // Do some other stuff 
} 

不要忘了,當你用它做釋放內存。