- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个程序,该程序将读取两个文件(hw8.data 和 codex.data),hw8.data 包含一首诗,codex.data 包含要替换该诗中的单词。我已经将要加载的文件并保存在链接列表中。我无法找到匹配的单词并替换它们。例如,我也无法将标点符号从 hw8 转移到新替换的单词上。 hw8: Hello World 。,抄本:世界sup,所以诗中的新词将是你好sup。这是hw8.data
Eye have a spelling chequer,
It came with my Pea Sea.
It plane lee marks four my revue,
Miss Steaks I can knot sea.
Eye strike the quays and type a whirred,
And weight four it two say,
Weather eye am write oar wrong,
It tells me straight aweigh.
Eye ran this poem threw it,
Your shore real glad two no.
Its vary polished in its weigh.
My chequer tolled me sew.
A chequer is a bless thing,
It freeze yew lodes of thyme.
It helps me right all stiles of righting,
And aides me when eye rime.
Each frays come posed up on my screen,
Eye trussed too bee a joule.
The chequer pours over every word,
Two cheque sum spelling rule.
Codex.data(不是全部)
Eye I
eye I
chequer checker
Pea P
Sea C
plane plainly
lee skip
four for
revue review
Miss Mistakes
Steaks skip
knot not
sea see
quays keys
.
.
.
这是我的代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct node {
char * word;
struct node* next;
};
struct codex {
char *word1;
char *word2;
struct codex *next;
};
struct node *loadWords(FILE *stream);
struct codex *loadCodex(FILE *stream);
struct node *exchange(struct node *head, struct codex *headC);
int main()
{
FILE *stream = NULL;
struct node *head;
struct node *temp;
struct node *loop;
struct codex *headC;
struct codex *tempC;
struct codex *loopC;
head = loadWords(stream);
if (head == NULL) {
return 1;
}
temp = head;//print each word
while (temp != NULL) {
//printf ( "%s\n", temp->word);
temp = temp->next;
}
headC = loadCodex(stream);
if (headC == NULL) {
return 1;
}
tempC = headC;//print each word
while (tempC != NULL) {
//printf ( "%s %s\n", tempC->word1, tempC->word2);
tempC = tempC->next;
}
struct node *exchangedHead;
struct node *temp2;
exchangedHead = exchange(head, headC);
if (exchangedHead == NULL) {
return 1;
}
temp2 = exchangedHead;//print each word
while (temp2 != NULL) {
//printf ( "%s ", temp2->word);
temp2 = temp2->next;
}
temp = head;// free memory
while(temp != NULL) {
loop = temp->next;
free ( temp->word);
free ( temp);
temp = loop;
}
tempC = headC;// free memory
while (tempC != NULL) {
loopC = tempC->next;
free ( tempC->word1);
free ( tempC->word2);
free ( tempC);
tempC = loopC;
}
return 0;
}
/*
* This function will go through and load the words from the text file and save it to
* the struct and link the current struct to the next one
*/
struct node *loadWords(FILE *stream) {
struct node *loop = NULL;
struct node *temp = NULL;
struct node *head = NULL;
char *words = NULL;
char *currentWord;
size_t chrCount = 0;
if ((stream = fopen("hw8.data", "r")) == NULL) {
printf ("could not open file\n");
return NULL;
}
while(getline( &words, &chrCount, stream) > 0) {//read a line from file
currentWord = strtok(words, " ");//get first token
while (currentWord != NULL) {//loop through tokens
if((temp = calloc(1, sizeof(struct node))) == NULL) {
printf("ERROR - Could not allocate memory.\n");
exit(0);
}
temp->word = strdup ( currentWord);//allocate memory and copy token to word
if ( head == NULL) {
head = temp;//first structure
}
else {
loop = head;
while ( loop->next != NULL) {//loop to last structure
loop = loop->next;//add structure to end
}
loop->next = temp;
}
currentWord = strtok(NULL, " ");//next token
}
free (words);//release memory
chrCount = 0;//so readline will allocate memory for next line
words = NULL;
}
return head;
}
/*
* This function will go through and load the words from the text file and save it to
* the struct and link the current struct to the next one
*/
struct codex *loadCodex(FILE *stream) {
struct codex *loop = NULL;
struct codex *temp = NULL;
struct codex *head = NULL;
char *words = NULL;
char *currentWord;
char *currentWord2;
size_t chrCount = 0;
if (( stream = fopen("codex.data", "r")) == NULL) {
printf ("could not open file\n");
return NULL;
}
while(getline( &words, &chrCount, stream) > 0) {//read a line from file
currentWord = strtok(words, " ");//get first token
currentWord2 = strtok(NULL, "\n");
while (currentWord != NULL && currentWord2 != NULL) {//loop through tokens
if((temp = calloc(1, sizeof(struct node))) == NULL) {
printf("ERROR - Could not allocate memory.\n");
exit(0);
}
temp->word1 = strdup ( currentWord);//allocate memory and copy token to word
temp->word2 = strdup ( currentWord2);
if (head == NULL) {
head = temp;//first structure
}
else {
loop = head;
while ( loop->next != NULL) {//loop to last structure
loop = loop->next;//add structure to end
}
loop->next = temp;
}
currentWord = strtok(NULL, " ");//next token
}
free (words);//release memory
chrCount = 0;//so readline will allocate memory for next line
words = NULL;
}
return head;
}
struct node *exchange(struct node *head, struct codex *headC) {
struct node *temp;
temp = head;
while(head != NULL && headC != NULL) {
if(strcmp(head->word, headC->word1)) {
head->word = relloc(head->word, strlen(headC->word2));
head->word = headC->word2;
head->next = temp->next;
headC = headC->next;
temp = temp->next;
}
}
}
最佳答案
您在 exchange
中遇到的问题(除了拼写错误 realloc
并未能返回值)无法为 null-terminating
分配空间realloc
上的字符。 (注意我还没有检查列表操作的正确性)
head->word = realloc(head->word, strlen(headC->word2));
应该是
head->word = realloc(head->word, strlen(headC->word2) + 1);
这可以解释为什么你会失去 1-char
每行末尾的标点符号。
您还应该realloc
到 tmp
指针并仅分配 head->word = tmp;
如果重新分配成功。 (否则您会丢失 head->word
的原始内容)此外,如果您不打算从 exchange
返回值,只需使函数void
(否则返回 head
)。如果这不能解决问题,请告诉我,我会进行更深入的研究。
更多问题
查看代码,我发现了更多问题(一些很重要)。主要是您的exchange
功能就像火车失事一样。通常,在迭代链表时,您会创建一个临时指针来迭代,而不是使用列表地址(如 main
中所做的那样)。你为什么不这样做作为交换?鉴于此,我放弃了交换并重写了它。它包含在下面。在您的读取功能中,明智地选择使用getline
,但无需重置chrCount = 0;
或words = NULL;
为了 getline
分配下一行。它会自动完成。
但是,你在发线时犯规了words
至strtok
——无需先制作副本。为什么? getline
分配了空间并需要管理/释放它分配的内存块。当您发送 words
至strtok
它修改内存,插入 null-terminating
getline
时可能导致杂散错误的字符尝试free/realloc
block 。 始终复制 getline
分配的行在将行发送到 strtok
之前。此外,由于您必须释放副本,因此创建 pointer
到您的副本,以便保留内存块的起始地址,以便传递到 free
当你完成时。
未开封的FILE*
无需传递指向您的读取函数的指针。可以在函数内声明它。您需要通过的是 filename
所以你的阅读功能知道要打开什么。我变了main
包含其参数,以便您现在将单词/codex 文件名作为参数传递。
注意:我刚刚使用您的示例法典值进行测试。
查看代码中的修改和注释:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct node {
char * word;
struct node* next;
};
struct codex {
char *word1;
char *word2;
struct codex *next;
};
struct node *loadWords(char *filename);
struct codex *loadCodex(char *filename);
struct node *exchange(struct node *head, struct codex *headC);
int main (int argc, char **argv)
{
if (argc < 3) {
fprintf (stderr, "error: insufficient input. Usage: %s nodefile codexfile\n", argv[0]);
return 1;
}
// FILE *stream = NULL;
struct node *head;
struct node *temp;
struct node *loop;
struct codex *headC;
struct codex *tempC;
struct codex *loopC;
head = loadWords(argv[1]);
if (head == NULL) {
return 1;
}
printf ("\nOriginal:\n\n");
temp = head;//print each word
while (temp != NULL) {
printf ( " %s", temp->word);
temp = temp->next;
}
printf ("\n");
headC = loadCodex(argv[2]);
if (headC == NULL) {
return 1;
}
tempC = headC;//print each word
while (tempC != NULL) {
// printf ( "%s %s\n", tempC->word1, tempC->word2);
tempC = tempC->next;
}
struct node *exchangedHead;
struct node *temp2;
exchangedHead = exchange(head, headC);
if (exchangedHead == NULL) {
return 1;
}
printf ("\nExchanged:\n\n");
temp2 = exchangedHead;//print each word
while (temp2 != NULL) {
printf ( " %s", temp2->word);
temp2 = temp2->next;
}
printf ("\n");
temp = head;// free memory
while(temp != NULL) {
loop = temp->next;
free ( temp->word);
free ( temp);
temp = loop;
}
tempC = headC;// free memory
while (tempC != NULL) {
loopC = tempC->next;
free ( tempC->word1);
free ( tempC->word2);
free ( tempC);
tempC = loopC;
}
return 0;
}
/*
* This function will go through and load the words from the text file and save it to
* the struct and link the current struct to the next one
*/
struct node *loadWords(char *filename) {
FILE *stream = NULL;
struct node *loop = NULL;
struct node *temp = NULL;
struct node *head = NULL;
char *words = NULL;
char *currentWord;
size_t chrCount = 0;
ssize_t nchr = 0;
if ((stream = fopen(filename, "r")) == NULL) {
printf ("could not open file\n");
return NULL;
}
while((nchr = getline (&words, &chrCount, stream)) != -1) {//read a line from file
char *wtemp = strdup (words); /* copy words, strtok will modify */
char *sp = wtemp; /* save wtemp address, pass sp */
currentWord = strtok(sp, " ");//get first token
while (currentWord != NULL) {//loop through tokens
if((temp = calloc(1, sizeof(struct node))) == NULL) {
printf("ERROR - Could not allocate memory.\n");
exit(0);
}
temp->word = strdup (currentWord);//allocate memory and copy token to word
if ( head == NULL) {
head = temp;//first structure
}
else {
loop = head;
while ( loop->next != NULL) {//loop to last structure
loop = loop->next;//add structure to end
}
loop->next = temp;
}
currentWord = strtok(NULL, " ");//next token
}
if (wtemp) free (wtemp);
wtemp = NULL;
// chrCount = 0; //so readline will allocate memory for next line (***NOT REQUIED***)
// words = NULL; (***NOT REQUIED***)
}
if (words) free (words);//release memory
if (stream) fclose (stream);
return head;
}
/*
* This function will go through and load the words from the text file and save it to
* the struct and link the current struct to the next one
*/
struct codex *loadCodex(char *filename) {
FILE *stream = NULL;
struct codex *loop = NULL;
struct codex *temp = NULL;
struct codex *head = NULL;
char *words = NULL;
char *currentWord;
char *currentWord2;
size_t chrCount = 0;
ssize_t nchr = 0;
if (( stream = fopen(filename, "r")) == NULL) {
printf ("could not open file\n");
return NULL;
}
while(getline( &words, &chrCount, stream) > 0) {//read a line from file
while (nchr > 0 && (words[nchr-1] == '\n' || words[nchr-1] == '\r'))
words[--nchr] = 0; /* strip newline or carriage rtn */
char *wtemp = strdup (words); /* copy words, strtok will modify */
char *sp = wtemp; /* save wtemp address, pass sp */
currentWord = strtok(sp, " ");//get first token
currentWord2 = strtok(NULL, "\n");
while (currentWord != NULL && currentWord2 != NULL) {//loop through tokens
if((temp = calloc(1, sizeof(struct node))) == NULL) {
printf("ERROR - Could not allocate memory.\n");
exit(0);
}
temp->word1 = strdup ( currentWord);//allocate memory and copy token to word
temp->word2 = strdup ( currentWord2);
if (head == NULL) {
head = temp;//first structure
}
else {
loop = head;
while ( loop->next != NULL) {//loop to last structure
loop = loop->next;//add structure to end
}
loop->next = temp;
}
currentWord = strtok(NULL, " ");//next token
}
if (wtemp) free (wtemp);
wtemp = NULL;
// chrCount = 0;//so readline will allocate memory for next line
// words = NULL;
}
if (words) free (words);//release memory
if (stream) fclose (stream);
return head;
}
// struct node *exchange(struct node *head, struct codex *headC) {
// struct node *temp;
// temp = head;
// while(head != NULL && headC != NULL) {
// if(strcmp(head->word, headC->word1)) {
// head->word = realloc(head->word, strlen(headC->word2));
// head->word = headC->word2;
// head->next = temp->next;
// headC = headC->next;
// temp = temp->next;
// }
// }
// }
struct node *exchange(struct node *head, struct codex *headC)
{
struct node *temp = head;
while(temp != NULL)
{
char *wtemp = NULL;
struct codex *tempC = headC;
while (tempC != NULL)
{
if (strcmp(temp->word, tempC->word1) == 0) {
size_t tclen = strlen(tempC->word2);
wtemp = realloc(temp->word, tclen + 1); /* add 1 for null-term */
if (!wtemp) {
fprintf (stderr, "%s() error: realloc failed.\n", __func__);
return head;
}
temp->word = wtemp;
memcpy (temp->word, tempC->word2, tclen + 1); /* copies the null-term also */
}
tempC = tempC->next;
}
temp = temp->next;
}
return head;
}
输出
$ ./bin/ll_single_replace_w dat/ll_replace_poem.txt dat/ll_replace_codex.txt
Original:
Eye have a spelling chequer,
It came with my Pea Sea.
It plane lee marks four my revue,
Miss Steaks I can knot sea.
Eye strike the quays and type a whirred,
And weight four it two say,
Weather eye am write oar wrong,
It tells me straight aweigh.
Eye ran this poem threw it,
Your shore real glad two no.
Its vary polished in its weigh.
My chequer tolled me sew.
A chequer is a bless thing,
It freeze yew lodes of thyme.
It helps me right all stiles of righting,
And aides me when eye rime.
Each frays come posed up on my screen,
Eye trussed too bee a joule.
The chequer pours over every word,
Two cheque sum spelling rule.
Exchanged:
I have a spelling chequer,
It came with my P Sea.
It plainly skip marks for my revue,
Mistakes skip I can not sea.
I strike the keys and type a whirred,
And weight for it two say,
Weather I am write oar wrong,
It tells me straight aweigh.
I ran this poem threw it,
Your shore real glad two no.
Its vary polished in its weigh.
My checker tolled me sew.
A checker is a bless thing,
It freeze yew lodes of thyme.
It helps me right all stiles of righting,
And aides me when I rime.
Each frays come posed up on my screen,
I trussed too bee a joule.
The checker pours over every word,
Two cheque sum spelling rule.
关于c - 与 Codex C 交换结构体中的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29359214/
我有以下数据框 (df_hvl),列名“FzListe”和以下数据: FzListe 7MA1, 7OS1 7MA1, 7ZJB 7MA2, 7MA3, 7OS1 76G1, 7MA1, 7OS1 7
我有点小问题。仅当尝试写入的相同字符串/单词不存在时,我才想写入文件。在我的例子中,它是一个 IP 地址和端口,用“:”分隔。如果我手动写入文件,例如 193...:80 和 193...:22,它指
如何返回结果列中的单词示例? 我得到的最接近的是 [\W]{2,}[^,\W].+[?=,] ID 文本 我的结果(完全匹配) 预期(完全匹配) 1 词A,世界B,词C , 世界 B, 字B 2 wo
我想在引号之间得到一个字符串 我知道一个解决方案是: /'.*?'/ 但问题是它不适用于英语中的所有格或收缩格 例如: What is the name of Mario's brother in t
我应该在句子中找到出现最多的单词。 这是我尝试过的,但不起作用。 '); $max = -1; $resultWords = array(); $resultCount = array(); $i =
我是vim的新手。我正在尝试练习(最近阅读了一些教程),但是我发现我不能不突出显示“复制粘贴”中的字符/单词/行。 在Textmate中,我通常使用SHIFT + CTRL + LeftArrowKe
有谁知道一个JSON格式的英语词典,该词典具有(单词,定义和单词类型,例如名词/形容词/动词/副词) 这种格式: [ {"Word" : "Chair", "Definition" : "A
我正在做一些 javascript,同时我注意到我无法替换 html 标记内的“ document.getElementById('label').innerHTML = document.get
您好,我正在使用 groovy 2.1.5,我必须编写一个代码来显示具有给定路径的目录的内容/文件,然后它会备份文件并替换文件中的单词/字符串。 这是我用来尝试替换所选文件中的单词的代码 String
我正在准备一个实验,我想使用python编写程序以识别参与者说出的某些单词。 我在python中搜索了很多有关语音识别的内容,但结果却很复杂(例如CMUSphinx)。 我要实现的是一个程序,该程序接
假设我有以下代码: $size = 23.9 $size = "$size GB" write $size 我想在其他事情上使用相同的变量,即 if ($size -lt 20) {...} 这显然是
我想替换字符串中单词 Date 的所有情况,除非它是 Date()(即 Date 后跟括号)。这是一个字符串示例以及我最初尝试的内容: x gsub("Date", paste("Date:", S
我对 Java 和编程都很陌生,请记住这一点,请不要对我严厉 ^^。接下来,我最近用 Java 进行了一些培训,我喜欢这个挑战,但现在我只是陷入困境。我做了一些示例来查找用户输入的最大字符串,一切都很
我必须给一个数字x,并写x个字符串(单词)。我必须找到写得最多的那一篇。它可以工作,但是当我尝试从文件中读取它时,却没有。例如,如果我执行 a.out'' #include #include in
这里是学习者,如果这个问题看起来很荒谬,请多多包涵。假设我试图引用字符串中的字符而不是字符串本身,我该怎么做呢?我的意思是; 给定:var str = "我想知道一个大脑分散的计算机如何保持理智" 我
这是阿克沙塔。我一直在解析以下数据。我想单独获取每个单词。我可以有一个示例代码以便我可以继续吗 RTRV-HDR RH01 SIMULATOR 09-11-18 16 13 19 M R
我有一个任意字符串,它总是包含至少一个英文单词后跟一系列数字:"Hello World 1234" 我如何只提取 "Hello World" 来自字符串? 最佳答案 在我看来你需要反正则表达式: St
我正在尝试输入一个四个单词的句子,然后能够使用indexOf和子字符串单独打印出每个单词。有什么想法我做错了吗? 已编辑 那么这就是它应该的样子吗?我已经运行了两次,得到了两个不同的答案,所以我不确定
如何在文本开头查找短语(单词) 我需要非常快速的解决方案来查明文本是否以某些已知短语开头 我在 Mysql (innodb) 表中的短语如下: CREATE TABLE IF NOT EXISTS `
我在 MYSQL 表中有一本字典,该表由 240 000 个单词组成。例如,如果我有字母 G、I、G、S、N> 和 O 我想选择表中包含所有或部分这些字母(并且没有其他字母)的所有单词。 可接受的词语
我是一名优秀的程序员,十分优秀!