我的功能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);
}

最佳答案

如果您只想打印行,则可以不进行复制和多余的循环即可:

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


您当前的代码无效,因为您以printf格式告诉%s它的参数将是一个字符串(也就是指向以零结尾的字符序列的指针),但是随后您给了它一个字符,没有这样的指针。

关于c - 指针和CString初学者的麻烦,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3743466/

10-09 20:20
查看更多