Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较C中两个文件中的字符串;_C_String - Fatal编程技术网

比较C中两个文件中的字符串;

比较C中两个文件中的字符串;,c,string,C,String,我是c语言的新手,所以我会感谢所有的帮助:D 我需要将第一个文件(“Albert\n Martin\n Bob”)中的给定单词与第二个文件(“Albert\n Randy\n Martin\n Ohio”)中的单词进行比较。 只要它们是一样的,我就需要在文件中输入单词“Language”;并在第二个文件中打印每个没有表示的单词” 诸如此类: 语言 语言 鲍勃 需要在我的第三个文件中 我试图想出一些主意,但都不管用 首先,您需要阅读这些文件 如果需要在C中执行此操作,则可以使用strcmp函数。它

我是c语言的新手,所以我会感谢所有的帮助:D 我需要将第一个文件(
“Albert\n Martin\n Bob”
)中的给定单词与第二个文件(
“Albert\n Randy\n Martin\n Ohio”
)中的单词进行比较。 只要它们是一样的,我就需要在文件中输入单词“Language”;并在第二个文件中打印每个没有表示的单词” 诸如此类: 语言 语言 鲍勃

需要在我的第三个文件中

我试图想出一些主意,但都不管用

首先,您需要阅读这些文件

如果需要在C中执行此操作,则可以使用strcmp函数。它允许您比较两个字符串

例如:

int strcmp(const char *s1, const char *s2);

首先,我会打开所有三个文件(输入文件和输出文件)。如果你不能打开所有文件,那么你就不能做任何有用的事情(除了显示错误消息或其他事情);而浪费CPU时间只是为了发现这一点(例如)以后无法打开输出文件。这也有助于减少竞争条件(例如,在处理第一个文件时第二个文件发生更改)

接下来,开始处理第一个文件。读取时将其拆分为单词/标记,并为每个单词/标记计算哈希值。然后使用哈希值和单词/标记本身检查新词/标记是否与先前的(已知)重复word/token。如果它不是重复的,请分配一些内存并为word/token创建一个新条目,然后将该条目插入到与哈希对应的链表中

最后,处理第二个文件。这与处理第一个文件的方式类似(将其分解为单词/标记,计算散列,使用散列来确定单词/标记是否已知),但如果单词/标记未知,则将其写入输出文件,如果已知,则将“语言”写入输出文件

如果您不熟悉哈希表,那么它们相当简单。对于计算ASCII/文本哈希值的简单方法(不是最好的方法),您可以执行以下操作:

hash = 0;
while(*src != 0) {
    hash = hash ^ (hash << 5) ^ *src;
    src++;
}
hash = hash % HASH_SIZE;
所有这些都是为了提高性能。例如,如果两个文件都有1024个字,那么(没有哈希表),您需要执行“strcmp()”1024*1024次;但是如果您使用带有“#define hash_SIZE 1024”的哈希表,您可能会将其减少到大约2000次(并最终得到更快的代码).HASH_SIZE的值越大,使用的内存量就越大(并减少不同单词具有相同HASH的可能性)


完成文件后不要忘记关闭它们。如果在此之后执行其他操作,释放使用的内存是一个好主意(但如果在此之后不执行任何操作,则“退出()”并让操作系统进行清理会更快更容易).

给我们看一些代码。你有什么想法吗?你有什么想法?它们是如何失败的?你的文件是什么样子的?它们是否包含任何分隔符?请添加尽可能多的其他详细信息,以便我们可以帮助你。
INDEX_ENTRY *find_entry(uint32_t hash, char *new_word) {
    INDEX_ENTRY *entry;

    entry = index[hash];
    while(entry != NULL) {
        if(strcmp(new_word, entry->word) == 0) return entry;
        entry = entry->next;
    }
    return NULL;
}