2016-12-04 3 views
3

Donc, j'essaie de supprimer les espaces vides à partir d'une entrée de sting par l'utilisateur. J'ai déjà une option où le programme compte les voyelles et inverse la chaîne. Celui où j'ai besoin d'aide commence par // espaços. Ce que j'ai fait était quelque chose comme: si la chaîne "palavra", l'original, a un espace (' ') dans n'importe quelle position, la nouvelle chaîne sans espace aura le caractère suivant de la chaîne "palavra" dans cette position:Effacer les espaces vides entre les chaînes dans C

/*palavra = " o l a _ o l a" 
      [0][1][2][3][4][5][6] 
    palavra3 = "o l a o l a" 
      [0][1][2][3][4][5]*/ 


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

void main(void) { 
    char palavra[10]; 
    char palavra2[10]; 
    char palavra3[10]; 
    int i; 
    int vogais = 0; 
    int j; 
    int k; 
    int espaco = 0; 

    printf("Introduza uma string: \n"); 
    scanf("%[^\n]", palavra); 

    //vogais 
    for (i = 0; palavra[i] != '\0'; i++) { 
     if (palavra[i] == 'a' || palavra[i] == 'e' || palavra[i] == 'i' || 
      palavra[i] == 'o' || palavra[i] == 'u' || 
      palavra[i] == 'A' || palavra[i] == 'E' || palavra[i] == 'I' || 
      palavra[i] == 'O' || palavra[i] == 'U') 
      vogais ++; 
     // else 
     //  printf(""); 
    } 

    printf("Vogais: %i", vogais); 

    //invertida 
    for (i = 0; palavra[i] != '\0'; i++); 
    { 
     k = i-1; 
    } 
    for (j = 0; j <= i-1; j++) { 
     palavra2[j] = palavra[k]; 
     k--; 
    } 

    printf("\nString invertida: %s", palavra2); 

    //espaços 
    for (i = 0; palavra[i]; i++) { 
     if (palavra[i] == ' ') 
      palavra3[i] = palavra[i + 1]; 
     //espaco++; 
    } 

    // printf("\nNumero de espacos: %i", espaco); 
    printf("\nString sem espacos: %s", palavra3); 
} 
+0

double possible de [enlever toutes les occurences d'un caractère dans une chaîne C - Exemple nécessaire] (http://stackoverflow.com/questions/4161822/remove-all-occurences-of-a-character-in-c-string-example-needed) –

+0

Curieux, qui ou quel texte a suggéré d'utiliser 'scanf ("% [^ \ n] ", palavra); quelque chose comme 'fgets (palavra, sizeof palavra, stdin); – chux

+1

J'ai essayé les deux, j'ai obtenu le même résultat. Im apprendre C à l'école, l'a obtenu à partir d'un pdf de l'enseignant. –

Répondre

4

Retirez le ; supplémentaire à la fin de for (i = 0; palavra[i] != '\0'; i++);

Avec la ; étrangère, la boucle est vide, le code suivant exécute une fois avec i égal à strlen(palavra).

Vous pouvez éviter ce genre de bug idiot en utilisant le style d'indentation Kernighan et Ritchie: mettre le { à la fin de la ligne avec le if, for, while, do ou switch déclaration. Cela le rend beaucoup moins susceptible de taper ; entre l'instruction de contrôle et son bloc.

Pour supprimer les espaces, utilisez la méthode 2 du doigt:

//espaços 
for (i = j = 0; palavra[i]; i++) { 
    if (palavra[i] != ' ') { 
     palavra3[j++] = palavra[i]; 
    } 
} 
palavra3[j] = '\0'; // set the null terminator 
+0

@chux: merci pour l'édition, la cohérence est en effet la règle d'or. – chqrlie

2

Gardez un compteur de la nouvelle longueur de la chaîne k, vérifier si un caractère est un espace, si elle est un espace ignorer k et incrément d'autre ajouter que le caractère à nouveau string.Example-

int k = 0;    //k will be the new string length after the loop 
for (int i = 0; palavra[i] != '\0'; i++) 
{ 
    if (palavra[i] != ' ') 
    { 
     palavra3[k++] = palavra[i]; 
    } 
} 
palavra3[k] = '\0'; 

Cet exemple fonctionne également dans le cas de plusieurs espaces consécutifs.