在堆分配的内存中打印字符串会打印出乱码数据

时间:2014-05-11 23:34:37

标签: c dictionary malloc

该计划必须具备以下特点:
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;
}

每当我尝试检查文件上的文字时,只会向我提供@@@@:\

任何人都可以帮我吗?

2 个答案:

答案 0 :(得分:1)

我在main中看到的问题:

  1. 您已声明:

    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.
    
  2. 您已使用以下内容为tab分配内存:

    tab = malloc(sizeof(int));
    

    分配的内存只能容纳一个整数。但你正在对它进行处理,因为它可以包含任意数量的整数:

    *(tab+i)=x;
    

    i > 0该行访问并写入尚未分配的内存时。

  3. x已定义但未初始化。但是,您尝试使用以下内容将其值存储在tab

    *(tab+i)=x;
    

    目前尚不清楚x的值应该是数据tab应该保留的内容。

  4. 我在adiciona中看到的问题:

    1. 我不知道您使用的语言。但是,我猜你正试图在文件中添加内容。如果要向文件添加内容,则必须使用“wa”打开它。

      FILE *f = fopen("dicionario.txt", "wa");
      
    2. 您使用的格式为%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 ...