- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我无法理解这一点。
首先我想指出,当我从输入命令行声明这一点时:
#define Please 100
#define routine 120
因为“Please”和“routine”具有相同的哈希值。我的程序覆盖了哈希表值,从我的输入控制台输入“请”将得到 120 的值。我如何解决覆盖问题,或者它只是本书的一部分?
其次,这部分
struct nlist *lookup (char *s)
{
struct nlist *np;
for (np = hashtab[hash(s)]; np != NULL; np = np->next)
return np;
return NULL;
}
特别是在for循环语句中。我的问题是 for 循环如何重复多次?因为我看到的只是每个 hashtab[hash(s)] 值的一个实例。
无论如何,这是完整的代码。您可以使用 gcc 运行它。 Undef() 工作得很好。
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
//#include <vld.h>
#define MAXWORD 100
struct nlist {
struct nlist *next;
char *name;
char *defn;
};
void error(int, char *);
int getca(void); // getch()
void getdef(void);
int getword(char *, int);
struct nlist *install(char *, char *);
struct nlist *lookup(char *);
void skipblanks(void);
void undef(char *);
void ungetca(int); // ungetch()
void ungets(const char *);
#define HASHSIZE 101
unsigned hash(char *);
static struct nlist *hashtab[HASHSIZE];
char *strdupli (char *); //strdup() function
int main(void)
{
char w[MAXWORD];
struct nlist *p;
while (getword(w, MAXWORD) != EOF)
if (strcmp(w, "#") == 0) /* beginning of direct */
getdef();
else if (!isalpha(w[0]))
printf("%s", w); /* cannot be defined */
else if ((p = lookup(w)) == NULL)
printf("%s", w); /* not defined */
else
ungets(p->defn); /* push definition */
return 0;
}
void ungets(const char *s)
{
size_t i = strlen(s);
while(i > 0)
ungetca(s[--i]);
}
void getdef(void)
{
int i;
char def[MAXWORD], dir[MAXWORD], name[MAXWORD];
skipblanks();
if (!isalpha(getword(dir, MAXWORD)))
error (dir[0],
"getdef: expecting a directive after #");
else if (strcmp(dir, "define") == 0) {
skipblanks();
if (!isalpha(getword(name, MAXWORD)))
error(name[0],
"getdef: non-alpha - name expected");
else {
skipblanks();
for(i = 0; i < MAXWORD - 1; i++)
if((def[i] = getca()) == EOF ||
def[i] == '\n')
break; /*end of definition*/
def[i] = '\0';
if(i <= 0) /* no definition */
error('\n', "getdef: incomplete define");
else /* install definition */
install (name, def);
}
} else if (strcmp(dir, "undef") == 0) {
skipblanks();
if(!isalpha(getword(name, MAXWORD)))
error(name[0], "getdef: non-alpha in undef");
else
undef(name);
} else
error(dir[0],
"getdef: expecting a directive after #");
}
struct nlist *install(char *name, char *defn)
{
struct nlist *np;
unsigned hashval;
if ((np = lookup(name)) == NULL) { /* not found */
np = (struct nlist *) malloc(sizeof(*np));
if (np == NULL || (np->name = strdupli(name)) == NULL)
return NULL;
hashval = hash(name);
np->next = hashtab[hashval];
hashtab[hashval] = np;
} else {/* already there */
free((void *) np->defn); /*free previous defn */
}
if ((np->defn = strdupli(defn)) == NULL)
return NULL;
return np;
}
void undef(char *s)
{
int h;
struct nlist *prev, *np;
prev = NULL;
h = hash(s);
for(np = hashtab[h]; np != NULL; np = np->next) {
if(strcmp(s, np->name)==0)
break;
prev = np;
}
if (np != NULL) {
if (prev == NULL)
hashtab[h] = np->next;
else
prev->next = np->next;
free((void *) np->name);
free((void *) np->defn);
free((void *) np);
}
}
unsigned hash(char *s)
{
unsigned hashval;
for (hashval = 0; *s != '\0'; s++)
hashval = *s + 31 * hashval;
return hashval % HASHSIZE;
}
struct nlist *lookup (char *s)
{
struct nlist *np;
for (np = hashtab[hash(s)]; np != NULL; np = np->next)
return np;
return NULL;
}
int getword(char *word, int lim)
{
int c, getca(void);
void ungetca(int);
char *w = word;
while(isspace(c = getca()))
;
if(c != EOF)
*w++ = c;
if(!isalpha(c)) {
*w = '\0';
return c;
}
for( ; --lim > 0; w++)
if(!isalnum(*w = getca())) {
ungetca(*w);
break;
}
*w = '\0';
return word[0];
}
void error(int c, char *s)
{
printf("error: %s\n", s);
while(c != EOF && c != '\n')
c = getca();
}
void skipblanks (void)
{
int c;
while ((c = getca()) == ' ' || c == '\t')
;
ungetca(c);
}
void strcopy (char *, const char *);
char *strdupli (char *s) /* make a duplicate of s */
{
char *p;
p = (char *) malloc (strlen(s) + 1);
if (p != NULL)
strcopy(p, s);
return p;
}
void strcopy (char *s, const char *t)
{
while ((*s++ = *t++) != '\0')
;
}
#define BUFSIZE 100
char buf[BUFSIZE]; /* buffer for ungetch */
int bufp = 0; /* next free position in buf */
int getca(void) /* get a (possibly pushed-back) character */
{
return (bufp > 0) ? buf[--bufp] : getchar();
}
void ungetca(int c) /* push character back on input */
{
if (bufp >= BUFSIZE)
printf("ungetch: too many characters\n");
else
buf[bufp++] = c;
}
最佳答案
这是一个示例,假设其他所有内容都与 K&R 的示例相同:
定义一个打印哈希表的函数:
void printTable(struct nlist* ptable[])
{
for (int i=0; i<HASHSIZE; i++)
if (ptable[i] != NULL)
{
printf("Hash table index %d content: \n", i);
int j = 0;
struct nlist *plist;
for (plist = ptable[i]; plist != NULL; plist = plist->next)
printf("\tList nr %d: name: '%s', defn: '%s'\n", j++, plist->name, plist->defn);
}
}
插入两个冲突的定义:
install("Please", "bla");
install("routine", "blabla");
并打印结果:
printTable(hashtab);
给予:
Hash table index 90 content:
List nr 0: name: 'routine', defn: 'blabla'
List nr 1: name: 'Please', defn: 'bla'
关于c - K&R第6-6节查表: Overwriting when hashvalues are the same,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17601098/
我正在从 Stata 迁移到 R(plm 包),以便进行面板模型计量经济学。在 Stata 中,面板模型(例如随机效应)通常报告组内、组间和整体 R 平方。 I have found plm 随机效应
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 6年前关闭。 Improve this qu
我想要求用户输入整数值列表。用户可以输入单个值或一组多个值,如 1 2 3(spcae 或逗号分隔)然后使用输入的数据进行进一步计算。 我正在使用下面的代码 EXP <- as.integer(rea
当 R 使用分类变量执行回归时,它实际上是虚拟编码。也就是说,省略了一个级别作为基础或引用,并且回归公式包括所有其他级别的虚拟变量。但是,R 选择了哪一个作为引用,以及我如何影响这个选择? 具有四个级
这个问题基本上是我之前问过的问题的延伸:How to only print (adjusted) R-squared of regression model? 我想建立一个线性回归模型来预测具有 15
我在一台安装了多个软件包的 Linux 计算机上安装了 R。现在我正在另一台 Linux 计算机上设置 R。从他们的存储库安装 R 很容易,但我将不得不使用 安装许多包 install.package
我正在阅读 Hadley 的高级 R 编程,当它讨论字符的内存大小时,它说: R has a global string pool. This means that each unique strin
我们可以将 Shiny 代码写在两个单独的文件中,"ui.R"和 "server.R" , 或者我们可以将两个模块写入一个文件 "app.R"并调用函数shinyApp() 这两种方法中的任何一种在性
我正在使用 R 通过 RGP 包进行遗传编程。环境创造了解决问题的功能。我想将这些函数保存在它们自己的 .R 源文件中。我这辈子都想不通怎么办。我尝试过的一种方法是: bf_str = print(b
假设我创建了一个函数“function.r”,在编辑该函数后我必须通过 source('function.r') 重新加载到我的全局环境中。无论如何,每次我进行编辑时,我是否可以避免将其重新加载到我的
例如,test.R 是一个单行文件: $ cat test.R # print('Hello, world!') 我们可以通过Rscript test.R 或R CMD BATCH test.R 来
我知道我可以使用 Rmd 来构建包插图,但想知道是否可以更具体地使用 R Notebooks 来制作包插图。如果是这样,我需要将 R Notebooks 编写为包小插图有什么不同吗?我正在使用最新版本
我正在考虑使用 R 包的共享库进行 R 的站点安装。 多台计算机将访问该库,以便每个人共享相同的设置。 问题是我注意到有时您无法更新包,因为另一个 R 实例正在锁定库。我不能要求每个人都关闭它的 R
我知道如何从命令行启动 R 并执行表达式(例如, R -e 'print("hello")' )或从文件中获取输入(例如, R -f filename.r )。但是,在这两种情况下,R 都会运行文件中
我正在尝试使我当前的项目可重现,因此我正在创建一个主文档(最终是一个 .rmd 文件),用于调用和执行其他几个文档。这样我自己和其他调查员只需要打开和运行一个文件。 当前设置分为三层:主文件、2 个读
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 5年前关闭。 Improve this qu
我的 R 包中有以下描述文件 Package: blah Title: What the Package Does (one line, title case) Version: 0.0.0.9000
有没有办法更有效地编写以下语句?accel 是一个数据框。 accel[[2]]<- accel[[2]]-weighted.mean(accel[[2]]) accel[[3]]<- accel[[
例如,在尝试安装 R 包时 curl作为 usethis 的依赖项: * installing *source* package ‘curl’ ... ** package ‘curl’ succes
我想将一些软件作为一个包共享,但我的一些脚本似乎并不能很自然地作为函数运行。例如,考虑以下代码块,其中“raw.df”是一个包含离散和连续类型变量的数据框。函数“count.unique”和“squa
我是一名优秀的程序员,十分优秀!