gpt4 book ai didi

c - C中的字数统计,学习更多CS

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:32:48 25 4
gpt4 key购买 nike

在使用 Python 和 JS 等动态语言编程大约 5 年后,我开始觉得自己错过了幕后发生的事情。诸如此类的语言真的很棒,因为它们可以让你专注于你必须做的事情,利用使用指针、内存分配和许多搜索、排序、插入算法的麻烦。尽管我从不后悔使用这些语言,因为我真的觉得它们非常强大,但我觉得,为了成为一名更好的程序员,我需要退后一步,了解幕后发生的事情!

我决定通过编写一个简单的单词计数器来做到这一点:该应用程序获取所有参数并输出所有唯一单词,每个单词都有一个计数器:“Hello world Hello”将返回“Hello: 2”、“world: 1"(不考虑实际输出结构)。这个程序在 Python 中相当于:

import sys
from collections import defaultdict

def main():
results = defaultdict(int)
for word in sys.argv[1:]:
results[word] += 1
print results

用 C 语言编写有点不同,我觉得我对指针、指针数组和所有这些东西完全错了!我想变得更好,帮助我变得更好!!

#include <stdio.h>
#include <stdlib.h>

// This is what a key-value pair: <int, string>
typedef struct {
int counter;
unsigned char* word;
} hashmap;

// Checks if inside the array of results, hashmap->word is equals to word paramter
hashmap* get_word_from_results(hashmap* results[], int count, const char* word) {
int i;
hashmap* result;
for (i = 0; i < count; i++) {
result = results[i];
if (result->word == (unsigned char *)word)
return result;
}
return NULL;
}

int main(int argc, const char *argv[])
{
hashmap* results;
int results_counter = 0;

int i;
const char* word;
for (i = 1; i < argc; i++) {
word = argv[i];
hashmap* result = get_word_from_results(&results, results_counter, word);
// If result is NULL, means word is not inserted yet, let's create a new hashmap and insert it inside the array
if (result == NULL) {
hashmap h;
h.counter = 1;
h.word = (unsigned char *)word;

results = realloc(NULL, (results_counter + 1) * sizeof(hashmap) );
// NOTE: potential memory leak? would h be deallocated?
results[results_counter] = h;
results_counter++;
printf("NEW\n");
} else {
// The word already exists in the hashmap array, let's increase it by 1
result->counter++;
printf("INCREMENTED\n");
}
}
return 0;
}

谁能给我一些建议?我在这里做错了什么?我的指点还好吗?我还认为我发现了内存泄漏(见评论),有人愿意提交他们的版本吗??

谢谢!!你们太酷了!!

丹尼尔

最佳答案

程序中的主要指针问题是,当 hashmap* results 第一次传递给 realloc 时,其值未初始化。这是未定义的行为。您应该将指针初始化为 NULL,如下所示:

hashmap* results = NULL;

另一个问题是比较字符串:您需要使用strcmp 而不是==。请记住,当字符串相等时,strcmp 返回零。

在你的程序结束时也有内存泄漏。您应该释放 results,以及存储在其元素中的单词。

当然,您称为 hashmap 的东西的行为与动态数组完全一样。然而,用 C 语言编写哈希表会带来不同程度的挑战,因此我鼓励您使用当前的方法。

关于c - C中的字数统计,学习更多CS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11468876/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com