2013-10-29 147 views
0
int ReadNames(char ***Names, int *n)  
{  
int i, k;  
char name[100];  
printf("Enter how many names\n");  
scanf("%d", n);  
/* Allocate memory and read names */ 
*Names=(char **)malloc((*n)*sizeof(char *)); 
for(i=0;i<(*n);i++) 
{ 
    *(*Names+i)=(char*)malloc(sizeof(name)); 
    gets(name); 
    strcpy(*(*Names+i),name); 
} 

for(i=0;i<(*n);i++) 
    printf("%s\n",*(*Names+i)); 
return 1; 
}  
void main()   
{ 
char **Names; 
int n, i; 
ReadNames(&Names, &n); 
} 

該程序運行良好......但與我所期待的有細微差別。問題是當我輸入'n'的值爲3時,它只能讀取2個字符串並打印這兩個字符串....即。它讀取n-1個字符串並打印n-1個字符串。我的代碼中有任何錯誤。爲字符串動態內存分配

+1

四件事情:首先*不投的'malloc'回報*。其次,爲什麼不使用簡單的數組索引而不是指針算術(比如'(* Names)[i]')。第三,不需要臨時的'name'變量。第四,不要使用'gets',而是使用'fgets'。 –

回答

2

讓每個'\n'得到處理的同時服用後輸入scanf()

只需添加getchar()。 您的代碼將是

int ReadNames(char ***Names, int *n) 
{ 
    int i, k; 
    char name[100]; 
    printf("Enter how many names\n"); 
    scanf("%d", n); 
    getchar(); // eats unnecessary '\n' in the buffer 
    /* Allocate memory and read names */ 
    *Names=(char **)malloc((*n)*sizeof(char *)); 
    for(i=0;i<(*n);i++) 
    { 
      *(*Names+i)=(char*)malloc(sizeof(name)); 
       gets(name); 
        strcpy(*(*Names+i),name); 
    } 

    for(i=0;i<(*n);i++) 
      printf("%s\n",*(*Names+i)); 
    return 1; 
} 
void main() 
{ 
    char **Names; 
    int n, i; 
    ReadNames(&Names, &n); 
} 
+0

....是的,它工作..thanks .... :) –

1

您所遇到的問題是最有可能的,因爲scanf你用得到計數離開換行仍然在緩衝區中。這意味着第一個gets調用會讀取單個換行符,並添加該空行。

一個簡單而容易的解決方案是在scanf格式之後添加一個空格,它告訴scanf跳過所有空格。像

scanf("%d ", n); 
1

1,請不要使用gets()使用fgets()代替。

fgets(name, sizeof name,stdin); 

在輸入結束時刪除換行符。

2.In在scanf()給輸入你應該按輸入
gets()正在這個新行作爲第一個字符串輸入後,你的情況。

有幾個簡單的解決方案

使用getchar()閱讀換行後scanf()

scanf()

%d後添加一個空格,如果您正在使用你可以使用窗口fflush()

3. Do not cast result of malloc因爲它返回的通用指針,它可以在沒有被分配投