- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <errno.h>
#define DICT_BUFSIZE 64
int compar(const void * a, const void * b)
{
const char* c1 = (const char*)a;
const char* c2 = (const char*)b;
printf("c1: %s | c2: %s\n", c1, c2);
return strcmp(c1, c2);
}
int main (void)
{
FILE* fdict;
uint32_t i;
char** dict = NULL;
size_t size = 0;
size_t size_alloced = 0;
char buf[DICT_BUFSIZE];
fdict = fopen("/usr/share/dict/words", "r");
if (!fdict) {
printf("Could not open \"%s\": %s\n", "usr/share/dict/words", strerror(errno));
exit(1);
}
for (i = 0; fgets(buf, DICT_BUFSIZE, fdict); ++i) {
size_t len;
if (i == size_alloced) {
dict = realloc(dict, (i +50000) * sizeof(*dict));
size_alloced += 50000;
}
len = strlen(buf);
dict[i] = malloc(len);
memcpy(dict[i], buf, len -1);
dict[i][len -1] = '\0';
}
size = i;
//for (i = 0; i < size; i++)
//printf("%s\n", dict[i]);
if(bsearch("company", dict, size, sizeof(*dict), compar))
printf("Found!\n");
for (i = 0; i < size; ++i)
free(dict[i]);
free(dict);
fclose(fdict);
return 0;
}
在“compar”函数中,“c1”变量(要搜索的键)正确显示,但 v2 变量中有垃圾输出。
这是一个示例输出:
c1: company | c2: ���
c1: company | c2: �$z
c1: company | c2: ��I
c1: company | c2: ��7
c1: company | c2: P�.
c1: company | c2: �b3
c1: company | c2: �1
c1: company | c2: P�/
c1: company | c2: ��0
c1: company | c2: PC0
c1: company | c2: @g0
c1: company | c2: y0
c1: company | c2: 0�0
c1: company | c2: ��0
c1: company | c2: `�0
c1: company | c2: ��0
c1: company | c2:
c1: company | c2: P�0
我无法理解这种行为。
最佳答案
如果您正在搜索 int
的数组,您将转换 const void *
与 int *
进行比较函数的参数,你不愿意吗?
您正在搜索 char *
的数组,所以您需要转换 const void *
char **
的参数— 并且您需要传递 char **
要查找的值的参数。
您的代码所需的更改很少但至关重要:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <errno.h>
#define DICT_BUFSIZE 64
static int compar(const void *a, const void *b)
{
const char *c1 = *(const char **)a;
const char *c2 = *(const char **)b;
printf("c1: %s | c2: %s\n", c1, c2);
return strcmp(c1, c2);
}
int main (void)
{
FILE* fdict;
uint32_t i;
char** dict = NULL;
size_t size = 0;
size_t size_alloced = 0;
char buf[DICT_BUFSIZE];
const char *file = "/usr/share/dict/words";
fdict = fopen(file, "r");
if (!fdict) {
printf("Could not open \"%s\": %s\n", file, strerror(errno));
exit(1);
}
for (i = 0; fgets(buf, DICT_BUFSIZE, fdict); ++i) {
size_t len;
if (i == size_alloced) {
dict = realloc(dict, (i +50000) * sizeof(*dict));
size_alloced += 50000;
}
len = strlen(buf);
dict[i] = malloc(len);
memcpy(dict[i], buf, len -1);
dict[i][len -1] = '\0';
}
size = i;
//for (i = 0; i < size; i++)
//printf("%s\n", dict[i]);
const char *search = "company";
if(bsearch(&search, dict, size, sizeof(*dict), compar))
printf("Found!\n");
for (i = 0; i < size; ++i)
free(dict[i]);
free(dict);
fclose(fdict);
return 0;
}
比较器函数现在需要两个 char **
值,并捕获每个值指向的字符串。
调用的第一个参数必须是 char *
的地址多变的;因此添加变量 const char *search = "company";
.
较小的清理包括使比较器函数静态(主要是为了满足我迂腐的默认编译选项 - 尽管最好在定义函数之前声明函数),以及使用变量 const char *file = "/usr/share/dict/words";
避免对 fopen()
的调用之间(接近)重复以及错误消息。
示例输出(在装有 macOS Sierra 10.12.3 的 Mac 上运行):
c1: company | c2: modifier
c1: company | c2: eagle
c1: company | c2: Canarian
c1: company | c2: counteridea
c1: company | c2: citropten
c1: company | c2: compulsoriness
c1: company | c2: coelenteric
c1: company | c2: Colossian
c1: company | c2: commonable
c1: company | c2: compilation
c1: company | c2: compagination
c1: company | c2: compatriot
c1: company | c2: comparition
c1: company | c2: comparable
c1: company | c2: companionate
c1: company | c2: companionway
c1: company | c2: comparability
c1: company | c2: company
Found!
关于c - 比较功能中的 Bsearch 和垃圾值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42171645/
我是 C 新手,还没有真正掌握 C 何时决定释放对象以及何时决定保留对象。 heap_t 是指向结构堆的指针。 heap_t create_heap(){ heap_t h_t = (heap
我有一个问题,我不知道如何解决。问题是: char * ary = new Char[]; ifstream fle; fle.open(1.txt, ios_base::binary); fle.s
假设我在 C# 中有字符串:“我看不到你……” 我想删除(替换为空等)这些“’”符号。 我该怎么做? 最佳答案 那个“垃圾”看起来很像有人将 UTF-8 数据解释为 ISO 8859-1 或 Wi
我无法在解析方法中更改蜘蛛设置。但这绝对是一种方式。 例如: class SomeSpider(BaseSpider): name = 'mySpider' allowed_domains
在开始之前,我们先回顾一下堆是个什么玩意,大家可能都知道,我们每天创建的Java对象几乎都存放在堆上面,所以说堆是一个巨大的对象池一点都不过分,在这个对象池里面管理者数据巨大的对象实例。 在对
我想知道为什么 printf() 在提供数组且没有格式化选项时成功打印字符数组,但在使用整数数组时编译器会抛出警告并打印垃圾值。 这是我的代码: #include int main() { c
我正在研究 Scrapy 库并尝试制作一个小爬虫。 这是爬虫的规则: rules = ( Rule(LinkExtractor(restrict_xpaths='//div[@class="w
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Printing a string to a temporary stream object in C++
这个问题在这里已经有了答案: Are WebGL objects garbage collected? (2 个答案) 关闭 3 年前。 在 WebGL 中,纹理的创建和销毁使用: WebGLTex
我继承了以下代码: (为保护无辜者更改了一些名称。) package foo.bar.baz; import javax.swing.JPanel; //Main panel in the GUI c
如果我没记错的话,在某些情况下,Java 中的 lambda 会生成为匿名类实例。例如,在这段代码中,lambda 需要从外部捕获一个变量: final int local = 123456; lis
我正在阅读托管代码中的内存泄漏,想知道是否可以在 C# 不安全代码中创建它? unsafe { while(true) new int; } 我不确定如果它作为不安全代码运行,是否会被 GC
假设我有以下用 HTML 编写的网页(仅正文部分): ... function fn() { // do stu
我想知道是否有简单的命令可以删除在 latex 编译过程中生成的所有不必要的文件,例如.aux、.log 等 最好将它链接到常规的 Latex 构建命令,这样在我点击“编译”后,垃圾文件就会被删除。
Java 在 Java7 中引入了带有字符串的 switch case。我想知道使用这样的开关盒是否会产生垃圾。 例如在我的程序中, String s = getString(); switch(s)
Cevelop将 char junk 作为“未初始化的变量”对象。在这种情况下,解决问题的正确方法是什么? friend std::ostream& operator>(std::istream&
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and t
我正在编写一个发送和接收纯文本的小型 boost asio tcp 服务器和客户端。通信或多或少是请求响应。在测试期间,我想我只是向服务器发送垃圾数据,向它发送 100.000 个请求。 客户端发
我正在使用 SAX 来读取/解析 XML 文档,并且它工作正常,除了这个特定的站点,在该站点中 eclipse 告诉我“文档元素之后的垃圾”并且我没有返回任何数据 http://www.zachblu
这是我的 Scrapy 爬虫代码。我正在尝试从网站中提取元数据值。没有元数据在一个页面上出现多次。 class MySpider(BaseSpider): name = "courses"
我是一名优秀的程序员,十分优秀!