2016-03-23 10 views
0

Der Code, den ich schrieb, soll die Menge von a, c, t und g in einer Char-Zeiger-Liste zählen. Wenn dann das eingegebene Zeichen kein a, c, t oder g ist, dann soll es den ungültigen Buchstaben in die Zeichenliste invalidBase einfügen. Stattdessen, wenn ich die Daten agtcpoop gebe, druckt es ungültige Basis aus: aber die Zeichen sind nicht dort, wenn es poop ausdrucken soll. Bitte helfen Sie! Hier ist der Code:Verschachtelte if-else-Anweisungen geben mir Probleme

void countBase(char *p) 
{ 
    int aCount = 0, cCount = 0, tCount = 0, gCount = 0; 
    char invalidBase[100]; 
    int i, j=0; 
    while(*p != '\0') 
{ 
    if(*p == 'A' || *p == 'a') 
    { 
    aCount++; 
    } 
    else if(*p == 'C' || *p == 'c') 
    { 
    cCount++; 
    } 
    else if(*p == 'T' || *p == 't') 
    { 
    tCount++; 
    } 
    else if(*p == 'G' || *p == 'g') 
    { 
    gCount++; 
    } 
    else 
    { 
    invalidBase[j] = *p; 
    } 
    j++; 
    p++; 
} 

for(i = 0; invalidBase[i] != '\0'; i++) 
{ 
    printf("Invalid Base: %c\n", invalidBase[i]); 
} 

printf(" A: %i\n C: %i\n T: %i\n G: %i\n", aCount, cCount, tCount, gCount); 
} 
+0

Meine Vermutung jetzt nach mehr darüber nachzudenken, ist, dass ich zu dereferenzieren invalidBase in der else-Anweisung müssen? Mit einem Zeiger? So wie es in der else-Anweisung sein soll * invalidBase = * p; Dann inkrementieren Sie invalidBase statt j ++. Ist das nahe? ** Ich denke, das ist Weg, nachdem ich Mikeks REPLY! ** – Cole

+0

Nein, Sie können 'invalidBase' nicht erhöhen, weil es ein Array ist und wird automatisch in einen Zeiger, die ID nicht ein Lvalue konvertiert, wenn es verwendet wird Ausdrücke mit Ausnahme von Operanden von 'sizeof' oder unary' & 'operator. – MikeCAT

+0

Sie können anstelle dieser vielen 'if-else'-Anweisungen' switch' Anweisungen verwenden. – MikeCAT

Antwort

3

Yoy aufgerufen undefiniertes Verhalten durch Werte von nicht initialisierten Variablen mit automatischer Speicherdauer verwendet, die unbestimmt ist.

zu verbessern:

  • Erhöhungsschritte der Zähler j nur dann, wenn ein Datum zu invalidBase gespeichert ist.
  • Verwenden Sie j, um die zu druckende Länge zu bestimmen.

Verbesserte Code:

void countBase(char *p) 
{ 
    int aCount = 0, cCount = 0, tCount = 0, gCount = 0; 
    char invalidBase[100]; 
    int i, j=0; 
    while(*p != '\0') 
    { 
     if(*p == 'A' || *p == 'a') 
     { 
     aCount++; 
     } 
     else if(*p == 'C' || *p == 'c') 
     { 
     cCount++; 
     } 
     else if(*p == 'T' || *p == 't') 
     { 
     tCount++; 
     } 
     else if(*p == 'G' || *p == 'g') 
     { 
     gCount++; 
     } 
     else 
     { 
     if(j < (int)(sizeof(invalidBase)/sizeof(*invalidBase))) /* avoid buffer overrun */ 
     { 
      invalidBase[j] = *p; 
      j++; 
     } 
     } 
     p++; 
    } 

    for(i = 0; i < j; i++) 
    { 
     printf("Invalid Base: %c\n", invalidBase[i]); 
    } 

    printf(" A: %i\n C: %i\n T: %i\n G: %i\n", aCount, cCount, tCount, gCount); 
} 

Beachten Sie, dass switch Anweisung anstelle dieser vielen if-else Aussagen verwenden können.

void countBase(char *p) 
{ 
    int aCount = 0, cCount = 0, tCount = 0, gCount = 0; 
    char invalidBase[100]; 
    int i, j=0; 
    while(*p != '\0') 
    { 
     switch(*p) 
     { 
     case 'A': 
     case 'a': 
     aCount++; 
     break; 
     case 'C': 
     case 'c': 
     cCount++; 
     break; 
     case 'T': 
     case 't': 
     tCount++; 
     break; 
     case 'G': 
     case 'g': 
     gCount++; 
     break; 
     default: 
     if(j < (int)(sizeof(invalidBase)/sizeof(*invalidBase))) /* avoid buffer overrun */ 
     { 
      invalidBase[j] = *p; 
      j++; 
     } 
     break; 
     } 
     p++; 
    } 

    for(i = 0; i < j; i++) 
    { 
     printf("Invalid Base: %c\n", invalidBase[i]); 
    } 

    printf(" A: %i\n C: %i\n T: %i\n G: %i\n", aCount, cCount, tCount, gCount); 
} 
+0

Gott ich liebe dich <3. So ein dummer Fehler. Danke .... Ich habe es für immer angeschaut. War so viel Forschung in verschachtelte if-Schleifen denken, dass ich etwas falsch gemacht habe. Danke <3 – Cole

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

void countBase(char *p) { 
    int aCount = 0, cCount = 0, tCount = 0, gCount = 0; 
    char invalidBase[100]; 
    int i, j=0; 
    while(*p != '\0') { 
     if(tolower(*p) == 'a') { 
      aCount++; 
     } 
     else if(tolower(*p) == 'c') { 
      cCount++; 
     } 
     else if(tolower(*p) == 't') { 
      tCount++; 
     } 
     else if(tolower(*p) == 'g') { 
      gCount++; 
     } 
     else { 
      // This is the correct place to increment j. 
      invalidBase[j++] = *p; 
     } 

     // The following line is wrong. You can only increment j if an invalid 
     // base was found and inserted on the array. 
     // j++; 
     p++; 
    } 

    // Your code lacked the "end of string" delimitation. 
    invalidBase[j] = '\0'; 

    for(i = 0; invalidBase[i] != '\0'; i++) { 
     printf("Invalid Base: %c\n", invalidBase[i]); 
    } 

    printf(" A: %i\n C: %i\n T: %i\n G: %i\n", aCount, cCount, tCount, gCount); 
} 

int main(){ 
    printf("Testing '%s'\n", "agtcpoop"); 
    countBase("agtcpoop"); 
    puts("***********************************"); 
    printf("Testing '%s'\n", "a"); 
    countBase("a"); 
    puts("***********************************"); 
    printf("Testing '%s'\n", ""); 
    countBase(""); 
    puts("***********************************"); 
    printf("Testing '%s'\n", "p"); 
    countBase("p"); 
    return 0; 
} 
+0

Ah! Ich mag das! Vielen Dank! Viel sauberer. Außerdem dachte ich, dass es das \ 0 automatisch hinzugefügt hat? Ich habe es nie zum Zeiger hinzugefügt !? – Cole

+0

Diese Verwendung von 'tolower()' kann * undefiniertes Verhalten * zur Weitergabe von Werten außerhalb des Bereichs auslösen. Casting '* p' zu' unsigned char' vor der Übergabe ist gut, um es zu verhindern. – MikeCAT

Verwandte Themen