【发布时间】:2015-01-30 02:11:13
【问题描述】:
基本上我要做的是将数组中的所有元素向前移动,然后将新任务插入用户输入的任何位置。问题是fgets 以某种方式将用户输入的新字符串放入两个位置。所以当我打印整个任务数组时,我会得到这个:
new task
new task(wake should be here)
2. eat
3. class
4. homework
instead of
new task
1. wake
2. eat
3. class
4. homework
我不知道为什么会这样。当我像这样设置新任务时:tasks[task_location] = "new task"。清单出来了。有谁知道我做错了什么我已经尝试过其他事情,例如scanf,但我仍然遇到同样的问题。
#define elements_in_array 200
char** tasks;
FILE* fp;//fopen null check etc standard stuff i did too
tasks = (char**)malloc(elements_in_array * sizeof(char*));
for(i=0;i<elements_in_array;i++)
{
tasks[i] = malloc(tasks_entered * sizeof(char));
}
while(!feof(fp))// counts lines
{
c = fgetc(fp);
if(c == '\n')
{
tasks_entered+=1;
total_tasks = tasks_entered;
}
}
rewind(fp);
for(i=0;i<tasks_entered;i++)//reads strings into array
{
fgets(tasks[i],elements_in_array,fp);
}
printf("Where would you like to add this task?\n");
printf("Add task to #: ");
scanf("%d", &task_Location);
if(tasks_entered > total_tasks)
{
//i know i didnt realloc correctly but works for now
tasks = realloc(tasks,tasks_entered*2);
total_tasks = tasks_entered*2;
}
for(i=tasks_entered-1;i>=task_Location-1;i--)
{
tasks[i+1] = tasks[i];
}
fgets (tasks[task_location], elements_in_array, stdin);
tasks_entered+=1;
【问题讨论】:
-
如果
tasks只是一个指针数组,那么在调用fgets之前需要为输入字符串分配内存。请在您的问题中添加tasks的声明。 -
task[i]=malloc(tasks_entered * sizeof(char));对我来说似乎很可疑。你确定你想要tasks_entered吗?请改用tasks[i]=malloc(100)。 -
我在概念化动态数组分配时遇到了麻烦。我想做的是制作一个二维数组,我可以在其中存储字符串(短句的长度)。例如 arr[0] = "wake up", arr[1]= "eat some food" 等等。所以基本思想是计算文本文件中的行数,然后使数组足够大以容纳之前的行数在文本文件中。不幸的是,分配是使用动态分配的数组,这让我感到困惑。
-
尝试删除
!feof(fp)和 movec = fgetc(fp)那里。 -
然后在为它分配内存之前将字符串读入
task[i]。