2010-09-18 2 views
0

J'ai un problème avec la fonction replace. Ce que je veux accomplir est de remplacer certains caractères spéciaux, mais je n'ai pas encore écrit le code. Donc, dans la fonction replace, nous pouvons à ce moment dire que la fonction devrait imprimer la ligne pour la ligne que j'ai essayé d'écrire. Quelqu'un peut-il corriger cette fonction? Je ne peux pas vraiment l'obtenirProblèmes de débutant et de cstring

#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); 
} 
+0

Quelle est la question ici? – NullUserException

Répondre

1

Si vous voulez juste imprimer les lignes que vous pouvez le faire sans la copie et la boucle supplémentaire:

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

Votre code actuel ne fonctionne pas parce que vous dites printf avec le format %s que son argument sera une chaîne (un pointeur vers une séquence de caractères terminée par zéro), mais vous lui donnez un caractère unique, pas un tel pointeur.

+0

Merci. % c au lieu de% s a résolu mon problème. Je ne veux vraiment pas imprimer la ligne, il y a une autre fonction dans le code qui fait ça. Je veux curr-> node dans un tableau pour pouvoir manipuler les voyelles. Merci: D – user265767