指针和串口初学者的麻烦

时间:2010-09-18 20:58:40

标签: c string pointers

我对函数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 个答案:

答案 0 :(得分:1)

如果你只想打印线条,你可以在没有复制和额外循环的情况下进行打印:

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

您当前的代码不起作用,因为您告诉printf %s格式,其参数将是一个字符串(也就是指向零终止字符序列的指针),但是你给它一个字符,而不是这样的指针。