2013-10-29 39 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因为它返回的通用指针,它可以在没有被分配投