Указатели и проблемы начинающих cstring - PullRequest
0 голосов
/ 19 сентября 2010

У меня проблема с функцией replace. Я хочу заменить некоторые специальные символы, но я еще не написал код. Таким образом, в функции replace мы можем в данный момент просто сказать, что функция должна печатать строку за строкой, как я пытался написать. Может кто-нибудь исправить эту функцию? Я действительно не могу получить это

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

struct list_el {
    char *ord;
    int num;
    struct list_el *prev;
    struct list_el *next;
};

typedef struct list_el item;
struct list_el *head, *tail; /*Double linked list that makes it easier to add a element to the end of the FIFO list*/

void addNode(struct list_el *curr);
void readFile();
void print();
void replace();
void random();
void len();

int antE = 0;

int randint(int max) 
{ 
    int a = (max*rand()/(RAND_MAX+1.0));
    return a;
}

int main(int argc, char *argv[]) {
    item *curr;

    struct list_el *pa;

    if(argc == 3) {
        readFile();
    }
    if(argc == 1) {
        printf("Too few arguments, must bee 3");
    } else if(strcmp(argv[1], "print") == 0) {
        print();
    } else if(strcmp(argv[1], "random") == 0)  {
        random();
    } else if(strcmp(argv[1], "replace") == 0)  {
        replace();
    } else if(strcmp(argv[1], "remove") == 0)  {
        printf("Random kommando kalt");
    } else if(strcmp(argv[1], "len") == 0)  {
        len();
    } else {
        printf("Not a valid command");
    }

    if(argc == 3) {
        free(curr);
    }
}

void addNode(struct list_el *curr) {
    if(head == NULL) {
        head = curr;
        curr->prev = NULL;
    } else {
        tail->next = curr;
        curr->prev = tail;
    }

    tail = curr;
    curr->next = NULL;
}

void readFile()
{
    FILE *f = fopen("tresmaa.txt", "r");

    if(f == 0) {
        printf("Could not open file");
        exit(8);
    }
    item *curr;

    if(f != NULL) {
        int antE = 0;
        head = NULL;
        char buffer[300];

        while(fgets(buffer, 300-1,f) != NULL) {
            curr = (item*)malloc(sizeof(item));
            curr->ord = malloc(300);
            curr->num = antE;
            strcpy(curr->ord, buffer);
            antE++;
            addNode(curr);
        }
    }
    fclose(f);
}

/*Traverserer listen og printer ut linje for lije
 */
void print()
{
    item *curr;
    printf("Print text:\n");
    for(curr = head; curr != NULL; curr = curr->next) {
        printf("%s", curr->ord);
    }
}

/*Printer ut en tilfeldig setning
 */
void random()
{
    item *curr;
    int anum = randint(antE);
    for(curr = head; curr != NULL; curr = curr->next) {
        if(curr->num == anum) {
            printf("Print a random line:\n%s", curr->ord);
        }
    }
}

void replace()
{
    item *curr;
    int i;
    char tmp[300];

    printf("Replace vowels ...\n");
    printf("... with vowel 'a'\n");

    for(curr = head; curr != NULL; curr = curr->next) {
        strcpy(tmp, curr->ord);

        for(i = 0; i < strlen(tmp); i++) {
            printf("%s", tmp[i]);
        }
    }
}

void len()
{
    item *curr;
    long nc;
    int i;
    nc = 0;

    for(curr = head; curr != NULL; curr = curr->next) {
        nc += strlen(curr->ord);
    }
    printf("The text is %d characters long", nc);
}

1 Ответ

1 голос
/ 19 сентября 2010

Если вы просто хотите напечатать строки, вы можете сделать это без копирования и дополнительного цикла:

for(curr = head; curr != NULL; curr = curr->next) {
   printf("%s\n", curr->ord);
}

Ваш текущий код не работает, потому что вы говорите printf с форматом %sчто его аргумент будет строкой (он же указатель на последовательность символов с нулевым символом в конце), но затем вы даете ему один символ, а не такой указатель.

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