2011-10-22 6 views
1

J'ai un programme qui demande d'entrer une chaîne (mystring) et un char (ch). Ensuite, il supprime tous les caractères entrés (ch) de la chaîne (mystring). Par exemple "abcabc" et char 'a' alors le résultat devrait être "bcbc". -Quand j'utilise scanf le programme fonctionne bien si la chaîne n'a pas d'espaces. Si je saisis "abc abc abc" Il lit et ne traite que les 3 premières lettres (jusqu'à l'espace). Ensuite, on m'a conseillé d'utiliser gets (mystr); parce qu'il peut lire tout ce qui bouge. Mais quand j'utilise le résultat est le même que la chaîne d'entrée et rien ne se passe.C supprimer des caractères de la chaîne

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define N 100 

int main(int argc, char *argv[]) 
{ 
    char mystr[N] ,result[N]; 
    char ch; 
    int i,k; 
    k=0; 

    printf("enter string \n"); 
    //gets(mystr);/////////////////////////// 
    //scanf("%s",&mystr);/////////////////// 
    printf("enter char \n"); 
    scanf("%c",&ch); 
    scanf("%c",&ch); 

    for (i = 0; i <= strlen(mystr); i++) 
    { 
    if (mystr[i] != ch) 
    { 
     result[k]=mystr[i]; 
     k++; 
    } 
    } 
    puts(result); 
    system("pause"); 
    return 0; 
} 
+2

** ne pas ** utiliser 'gets()'. C'est intrinsèquement dangereux. –

Répondre

6
scanf("%c",&ch); 
scanf("%c",&ch); 

Ce deuxième scanf est votre problème . Il récupère le caractère de nouvelle ligne que vous entrez après la lettre que vous voulez supprimer (et écrase la valeur précédente de ch).

Débarrassez-vous-en.

S'il vous plaît noter, comme la page de manuel dit:

Ne jamais utiliser gets(). Parce qu'il est impossible de dire à l'avance combien de caractères gets() va lire, et parce que gets() continuera à stocker les caractères après la fin de la mémoire tampon, il est extrêmement dangereux à utiliser. Il a été utilisé pour briser la sécurité informatique. Utilisez plutôt fgets().

+2

C'est un bon conseil sur 'gets' - voir http://stackoverflow.com/questions/4023895/how-to-read-string-entered-by-user-in-c/4023921#4023921 pour une fonction d'entrée d'utilisateur décent. – paxdiablo

1

hmm - pas sûr de ce que le problème est - l'utilisation getstr, mais pas Scanf pour la chaîne, et il travaille pour moi en studio visuel

int main(int argc, char *argv[]) 
{ 
    char mystr[N] ,result[N]; 
    char ch; 
    int i,k; 
    k=0; 

    printf("enter string \n"); 
    gets(mystr);/////////////////////////// 
    //scanf("%s",&mystr);/////////////////// 
    printf("enter char \n"); 
    scanf("%c",&ch); 
    // scanf("%c",&ch); 

    for (i = 0; i <= strlen(mystr); i++) 
    { 
    if (mystr[i] != ch) 
    { 
     result[k]=mystr[i]; 
     k++; 
    } 
    } 
    puts(result); 
    system("pause"); 
    return 0; 
} 
1

Utilisez celui-ci:

char temp[2]; 
scanf("%1s",temp); 
ch = temp[0]; 

et utiliser gets

scanf lorsqu'il est utilisé avec char s a quelques problèmes (il obtient le "vieux" nouvelle ligne). Ici, nous "trichons" un peu et nous utilisons scanf pour obtenir une chaîne pouvant contenir jusqu'à un caractère. Une chaîne de 1 caractère a clairement besoin d'un second caractère pour le terminateur, donc un tableau de 2 caractères. Sachez qu'en utilisant un scanf pour le caractère à rechercher, vous ne serez pas en mesure d'insérer le caractère espace.

Notez que gets est une fonction "maléfique". Vous pouvez facilement faire des dépassements de tampon en l'utilisant (il ne vérifie pas que le tampon est assez grand). La "bonne" façon de le faire est normalement: fgets(mystr, N, stdin); (la variante "fichier" de gets a un nombre maximum de caractères qui peuvent être lus et ajoutera un \0 à la fin). Notez que si vous insérez 150 caractères dans un fgets, 99 ira à votre chaîne (parce que vous avez donné 100 de la taille maximale), 1x \0 sera ajouté et les autres caractères resteront dans le tampon "prêt" pour le prochain scanf/gets/fgets ... (pour le tester, réduire la mémoire tampon à une valeur plus petite, comme 5 caractères, et faire quelques tests)

1

Vous pouvez utiliser fgets() comme suggéré par xanatos avec un petit hack, de sorte que vous pouvez fiable gérer les caractères de retour. Changez simplement '\ n' en '\ 0' dans la chaîne obtenue en utilisant fgets.

Et dans votre programme, vous avez oublié de terminer la nouvelle chaîne avec un '\ 0'. Voici donc le code que vous recherchez.

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

#define N 100 

int main(int argc,char **argv){ 

char string[N],str1[N]; 
char ch; 
int i,k = 0; 

fgets(string,N,stdin); 
string[strlen(string)-1] = '\0'; 
scanf("%c",&ch); 

printf("\n%s , %c",string,ch); 
for (i=0;i<=strlen(string);i++) 
    if(string[i] != ch) 
     str1[k++] = string[i]; 

str1[k] = '\0'; 
printf("\n%s , %s\n",string,str1); 
return 0; 
} 
Questions connexes