2016-06-04 18 views
0
#include <stdio.h> 
#include <string.h> 


int main() 
{ 
char a[250]; 
char c1[1],c2[1]; 
int n,i; 


printf("Give text: "); 
gets(a); 

printf("Give c1: "); 
gets(c1); 
    printf("Give c2: "); 
gets(c2); 

n=strlen(a); 

for(i=0;i<n;i++) 
{ 
    if(a[i]==c1) 
{ 
     a[i]=c2; 
    } 
    if(a[i]==c2) 
{ 
    a[i]=c1; 
    } 
    } 
    printf("%s",a); 
return 0; 
} 

in einem Text begining ich brauche c1 mit c2 zu wechseln und umgekehrt, aber wenn ich das Programm starten, nachdem ich gebe, c1, c2 nichts geschah. Wo liege ich falsch?Verwirrung C

+0

Sie sollten nicht verwenden 'gets()', das unvermeidbare Risiko von Puffer hat überrannt, in C99 veraltet und von C11 entfernt. – MikeCAT

+1

'gets (c1);' mit 'char c1 [1]' ist schlecht, da dies nur null Zeichen + Nullzeichen akzeptieren wird. 'a [i] = c2;' und 'a [i] = c1;' sieht komisch aus, weil es angibt, was aus dem vom Array konvertierten Zeiger konvertiert wird. – MikeCAT

+0

Sie möchten lesen, wie C- "String" implementiert sind. Eine C- "string" definierte 'char c [1]' kann nichts mehr als die "emtpy-string": '" 'beinhalten. – alk

Antwort

0
  • gets() sollte nicht verwendet werden, da es sich nicht vermeiden Risiko von Pufferüberlauf hat, wird in C99 veraltet und wird von C11 entfernt.
  • c1 und c2 haben nicht genügend Puffergröße.
  • Sie sollten überprüfen, ob die Messwerte erfolgreich sind.
  • Sie sollten vor dem Vergleichen die Werte c1 und c2 dereferenzieren, um gelesene Zeichen abzurufen.
  • Sie sollten else if verwenden, oder das geänderte Zeichen wird erneut geändert.

Try this:

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

/* this is a simple implementation and the buffer for \n is wasted */ 
char* safer_gets(char* buf, size_t size){ 
    char* lf; 
    if (fgets(buf, size, stdin) == NULL) return NULL; 
    if ((lf = strchr(buf, '\n')) != NULL) *lf = '\0'; 
    return buf; 
} 

int main() 
{ 
    char a[250]; 
    char c1[4],c2[4]; /* need at least 3 elements due to the inefficient implementation of safer_gets */ 
    int n,i; 


    printf("Give text: "); 
    if(safer_gets(a, sizeof(a)) == NULL) 
    { 
    fputs("read a error\n", stderr); 
    return 1; 
    } 

    printf("Give c1: "); 
    if(safer_gets(c1, sizeof(c1)) == NULL) 
    { 
    fputs("read c1 error\n", stderr); 
    return 1; 
    } 
    printf("Give c2: "); 
    if(safer_gets(c2, sizeof(c2)) == NULL) 
    { 
    fputs("read c2 error\n", stderr); 
    return 1; 
    } 

    n=strlen(a); 

    for(i=0;i<n;i++) 
    { 
    if(a[i]==*c1) 
    { 
     a[i]=*c2; 
    } 
    else if(a[i]==*c2) 
    { 
     a[i]=*c1; 
    } 
    } 
    printf("%s",a); 
    return 0; 
} 
+0

Warum' c [4] '? Einer für den' char', ein für den '\ n' und eine für den' 0'-Terminator ergibt 3.: -S Ist das 4. das berühmte Angst-Byte?;-) – alk

+0

Und hmhm, und ich bezweifle, dass das Sehen von '* c1' die Dinge leichter zu verstehen macht, als nur ein' c [0] 'zu finden ... – alk

2

Zuerst don't use gets(), it's inherently dangerous, verwenden Sie stattdessen fgets().

Wenn Sie gets(c1), c1 als ein Ein-Element-Array verwendet haben, überschreiben Sie bereits den zugewiesenen Speicher, der undefined behavior aufruft.

Das heißt, Sie haben c1 und c2 als Ein-Element-Arrays, die nicht falsch, aber nicht erforderlich sind. Definieren Sie sie als einfache char Variablen

char c1; 
char c2; 

und nutzen sie, wie

scanf(" %c", &c1); // mind the space and don't forget to to check the return 
scanf(" %c", &c2); // value of scanf() to ensure proper scanning. 

Danach sollte die Prüfung auf a[i] == c2 kommen als else Konstrukt, sonst werden Sie die vorherige Operation überschreiben werden. So etwas wie

for(i=0;i<n;i++) 
{ 
    if(a[i]==c1) 
    { 
     a[i]=c2; 
    } 
    else if(a[i]==c2) 
    { 
    a[i]=c1; 
    } 
} 
+0

So wie es aussieht '& c1' ergibt 'char **'. '"% c "' erwartet ein 'char *'. – alk

+0

@alk erm ... din't Ich erwähne 'definiere sie als einfache Zeichenvariable und benutze sie wie 'schon? :) –

+0

In der Tat, hast du. Bitte entschuldigen Sie ...:} – alk