该计划必须具备以下特点:
1.应该管理单词词典。
1.1。单词存储在文件中
1.2。用户可以看到字典中的单词,更正或
在字典中添加新单词
1.3。每个单词都有一个唯一的ID(数字)
由程序自动完成。
2.管理或使用字典单词,程序必须将其加载到内存中的链表。
由此我将制作刽子手游戏,但现在我的代码是:
#include <stdio.h>
#include <stdlib.h>
void adiciona(char *ficheiro,char addword){
FILE *f = fopen("dicionario.txt", "w");
if (f == NULL)
{
printf("Error opening file!\n");
exit(1);
}
fprintf(f,"%s\n", addword);
fclose(f);
}
int main() {
int x,j,n,i=0,op;
int *tab;
char str[500],addword;
FILE *f;
f = fopen("dicionario.txt","r");
if(f==NULL){
printf("Erro, Dicionário não encontrado!");
exit(-1);
}
//do{
tab = malloc(sizeof(int));
if(tab==NULL){
puts("Nao ha memoria, bye bye!");
exit(-1);
}else puts("Memoria alocada");
while(fgets(str,500,f)!=NULL){
*(tab+i)=x;
i++;
}
fclose(f);
printf("\nIntroduza uma das opções:\n1-Ver tabela actual\n2-Adicionar palavra ao Dicionario\n3-Para sair\n\nopcao:");
scanf("%i",&op);
switch(op){
case 1:
for(i=0;i<n;i++)
printf("%s\n",*(tab+i));
break;
case 2:
printf("\nIntroduza a palavra para adicionar\n:");
scanf("%s",&addword);
adiciona("dicionario.txt",addword);
*tab =addword;
printf("\n\Palavra Introduzida com sucesso:%c\n",*(tab+i));
break;}
//}while(op != 3);
free(tab);
return 0;
}
每当我尝试检查文件上的文字时,只会向我提供@@@@:\
任何人都可以帮我吗?
答案 0 :(得分:1)
我在main
中看到的问题:
您已声明:
char str[500],addword;
但您正在尝试将字符串读入
中的addword
scanf("%s",&addword);
如果您想阅读一封信,请将scanf
行更改为:
scanf("%c",&addword);
如果要读取字符串,请将定义更改为:
char str[500],addword[500]; // Doesn't have to 500. It needs to be large
// enough to read your string.
您已使用以下内容为tab
分配内存:
tab = malloc(sizeof(int));
分配的内存只能容纳一个整数。但你正在对它进行处理,因为它可以包含任意数量的整数:
*(tab+i)=x;
当i > 0
该行访问并写入尚未分配的内存时。
x
已定义但未初始化。但是,您尝试使用以下内容将其值存储在tab
中
*(tab+i)=x;
目前尚不清楚x
的值应该是数据tab
应该保留的内容。
我在adiciona
中看到的问题:
我不知道您使用的语言。但是,我猜你正试图在文件中添加内容。如果要向文件添加内容,则必须使用“wa”打开它。
FILE *f = fopen("dicionario.txt", "wa");
您使用的格式为%s
,但要打印的参数为char
。
fprintf(f,"%s\n", addword);
您可以将格式更改为%c
或将参数addword
更改为char*
。
答案 1 :(得分:0)
堆分配的内存区域太小。使用realloc:
tab = malloc(sizeof(int));
size_t size = 1;
// ...
while(fgets(str,500,f)!=NULL){
if (i == size) {
size *= 2;
if (!realloc(tab,size)) {
// error
}
}
tab[i++] = x;
}
// and don't forget to zero-terminate your string ...