printf () печатает ненужные символы - PullRequest
2 голосов
/ 13 декабря 2011

Пожалуйста, помогите мне, он читает данные из файла .. и использует алгоритм замены FIFO .. Я не знаю, что не так, почему строка (при сравнении) содержит символ смайлика, когда я убедился, что поставил нулевой терминатор ..

пример файла содержимого:

load AAAAAAAA
load AAAAAAAA
load BBBBBBBB
load BBBBBBBB
load BBBBBBBB
load BBBBBBBB
load AAAAAAAA
load CCCCCCCC
load CCCCCCCC
load DDDDDDDD
load EEEEEEEE
load EEEEEEEE
load FFFFFFFF

Попробуй запустить ...

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

FILE *fpointer;

typedef struct cache Cache;
struct cache{
    char DATA[8];
    int COUNT;
    int LOAD;
    Cache *NEXT;
};

int scan(char *addr, Cache *front){
    while(front != NULL){
        printf("compare: %s & %s\n", addr, front->DATA);
        if(strcmp(addr, front->DATA) == 0){
            front->COUNT++;
            return 0;
        }
        front->LOAD++;
        front = front->NEXT;
    }
    return 1;
}


void FirstInFirstOut(int x){
    Cache *ITEM[x];
    Cache *front, *head;
    Cache *node;
    char addr[8]="";
    int i=0, j=0, k=0, m=0;

    for(i=0; i<x; i++){
        ITEM[i] = NULL;
    }

    front = NULL;
    head = NULL;

    while(!feof(fpointer)){
        fscanf(fpointer, "load %c%c%c%c%c%c%c%c\n", &addr[0],&addr[1],&addr[2],&addr[3],&addr[4],&addr[5],&addr[6],&addr[7]);
        addr[8] = '\0';
        printf("read item: %s\n", addr);

        if(front != NULL){
            if(scan(addr, front)==0)
                continue;
        }

        node = (Cache*)malloc(sizeof(Cache));
        strcpy(node->DATA, addr);
        node->COUNT = 0;
        node->LOAD = 0;
        node->NEXT = NULL;
        if(head == NULL){
            head = node;
            front = node;
        }else{
            head->NEXT = node;
            head = node;
        }


        if(j<x){
            ITEM[j] = node;
            printf("insert... %s\n", ITEM[j]->DATA);
        }else{
            m = j%x;          //get the new index
            free(ITEM[m]);
            ITEM[m] = node;
            printf("insert... %s\n", ITEM[m]->DATA);
        }
        j++;

    }

    printf("Cache itmes:\n");
    for(i=0; i<x; i++){
        printf("Item %d: ", i+1);
        if(ITEM[i]->DATA == NULL){
            printf("NULL\n");
        }else{
            for(k=0; k<8; k++){
                printf("%c", ITEM[i]->DATA[k]);
            }
            printf("\n");
        }
        free(ITEM[i]);
    }

}

int main(){
    char fname[20]="", algo[5]="";
    int entries=0;

    printf("Input file:\n");
    scanf("%s", fname);
    printf("Number of cache items:\n");
    scanf("%d", &entries);
    printf("Replacement algorithm:\n");
    scanf("%s", algo);

    if((fpointer = fopen(fname,"r")) == NULL){
        printf("Error opening file.\n");
        return main();
    }

    if(entries == 0){
        printf("Nothing in the cache.\n");
        return main();
    }

    if(strcmp(algo, "FIFO") == 0){
        FirstInFirstOut(entries);
    }


    return main();

}

1 Ответ

7 голосов
/ 13 декабря 2011

Я вижу одну проблему:

char addr[8]="";
....
addr[8] = '\0'; 

, что неверно.Поскольку индекс в C основан на 0, 8 не является допустимым индексом.

Похоже, вы хотите, чтобы массив char содержал 8 символов (кроме NUL-символа).В этом случае вам придется объявить его размером 9

Также похоже, что вы копируете эту строку addr в элемент структуры DATA.Поэтому вам придется изменить размер массива DATA char с 8 на 9, а также.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...