c - 使用 strtok 从文件中获取输入
问题描述
我正在尝试创建一个程序,该程序从文件中接收多个进程(名称、开始时间、剩余时间),然后使用循环算法来处理队列。
问题是,当我尝试使用strtok()
and标记文件的每一行时fgets()
,进程的名称总是错误的。
例如,如果第一行是P1 0 3
输出是这样的:
void RoundRobin(char *filename) {
Queue *q = initQueue();
char string[MAX_SIZE];
FILE *file;
Process process[20];
char *token;
file = fopen(filename, "r");
if (!file) {
printf("File Cannot Be Opened");
}
fgets(string, 150, file);
token = strtok(string, "=");
token = strtok(NULL, "+");
int time_quantum = atoi(token);
int process_count = 0;
while (fgets(string, 150, file)) {
char *token1;
token1 = strtok(string, " ");
process[process_count].name = token1;
token1 = strtok(NULL, " ");
process[process_count].starting_time = atoi(token1);
token1 = strtok(NULL, " ");
process[process_count++].remaining_time = atoi(token1);
token1 = strtok(NULL, " ");
}
for (int i = 0; i < process_count; i++) {
printf("%s %d %d\n", process[i].name, process[i].starting_time, process[i].remaining_time);
}
fclose(file);
}
解决方案
char[]
您正在为所有令牌解析重用一个。每次fgets()
都会覆盖 that 的内容,并返回指向 that 内部内存的指针。因此,每次从文件中读取新行时,已经存储在数组中的先前指针仍指向同一内存,但该内存的内容已更改。char[]
strtok()
char[]
process[]
相反,您需要为要保存在数组中的char[]
每个字符串分配一个单独的字符串。您可以使用它,例如:name
process[]
strdup()
while (fgets(string, 150, file)){
char* token1 token1 = strtok(string, " ");
process[process_count].name = strdup(token1); // <-- HERE
...
}
// use process[] as needed...
for(int i = 0; i < process_count; i++){
free(process[i].name);
}
推荐阅读
- c++ - 避免在 C++17 中为每个联合样式类编写构造函数
- javascript - 使用 svg 外来对象的 d3.js 代码在 Safari Mac 中不起作用
- excel - Excel - 具有多个结果的 XLOOKUP
- html - ngFor 无法通过与 @Input 的组件绑定来迭代另一个组件
- google-apps-script - 强制重新授权 Google Add On 的范围
- excel - 在 VBA 中使用 WITH 刷新 Excel 2016 数据透视表失败?
- java - java.lang.NullPointerException:ImageView.setImageDrawable(android.graphics.drawable.Drawable)
- python - 为什么 scipy.optimize.curve_fit 没有产生最适合我的点的线?
- algorithm - 最早期限内动态零星服务器的优先级优先
- telethon - 为什么我自己的频道会显示“telethon.errors.rpcerrorlist.ChannelPrivateError”?