你评论里的人是对的。你真的应该向我们展示你的尝试。如果这是家庭作业,那么您就不能作弊,因为您的讲师可以通过简单的谷歌搜索将您淘汰。期望我们在这里猜测您的理解并涵盖您已经涵盖的内容是浪费的,因此请向我们展示您所做的事情。
qsort,bsearch并strcmp为以字符串开头的任何内容(例如,以字符串为前缀的结构)提供简单、相对有效的排序和搜索机制。格式字符串fscanf中的空格表示尽可能多地使用空格。fscanf返回一个指示成功和失败模式的值,这意味着您不一定需要将每一行读入一个字符数组来测试输入是否与特定格式匹配。但是,您在设计文件时确实需要小心,以使所有命令都没有与其他命令相同的前缀。在这种情况下,你是安全的。
这是我的尝试。调试愉快:)
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct language_table { char language[64]; size_t count; };
struct language_table *parse(FILE *f, size_t *s);
int main(void) {
size_t s;
struct language_table *t = parse(stdin, &s);
while (s-- > 0) {
printf("audio-language is found with setting: %s %zu times\n", t[s].language, t[s].count);
}
free(t);
}
struct language_table *parse(FILE *f, size_t *s) {
char locked, language[64];
unsigned int position;
int c = 0;
struct language_table *table = NULL, *entry;
size_t size = 0;
do {
if (fscanf(f, " locked %c", &locked) == 1 && strchr("ynYN", locked)) {
/* XXX: Do something with locked. */
}
else if (fscanf(f, " position %u", &position) == 1) {
/* XXX: Do something with position. */
}
else if (fscanf(f, " audio-language %63s", language) == 1) {
/* search for the language in table. */
entry = bsearch(language, table, size, sizeof *table, strcmp);
/* insert the language if it's not found. */
if (entry == NULL) {
if ((size & (size + 1)) == 0) {
void *new = realloc(table, (size * 2 + 1) * sizeof *table);
if (new == NULL) {
fprintf(stderr, "failed to allocate new entry for %s\n", language);
free(table);
return NULL;
}
table = new;
}
entry = table + size++;
strcpy(entry->language, language);
entry->count = 0;
/* sort & search */
qsort(table, size, sizeof *table, strcmp);
entry = bsearch(language, table, size, sizeof *table, strcmp);
}
entry->count++;
}
else {
/* consume an invalid line */
do {
c = fgetc(f);
} while (c >= 0 && c != '\n');
}
} while (c >= 0);
*s = size;
return table;
}