2016-03-23 16 views
0

Yazdığım kodun, bir char işaretçi listesinde a's, c's, t's ve g'nin miktarını sayması bekleniyor. Daha sonra, girilen char a, c, t veya g değilse, geçersiz harfi geçersiz listeye geçersizBase eklenmesi gerekir. Bunun yerine agtcpoop veri girdiğimde Geçersiz Baz yazdırır: ama kaka baskısı gerekiyorsa chars orada değil. Lütfen yardım et! Burada kodudur:İç içe if-else ifadeleri bana sorun veriyor

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

Benim tahminim, başka açıklamada KQUEUE invalidBase gereken bu mu? İşaretçiyi kullanarak mı? Diğer ifadede olduğu gibi * geçersizBase = * p; daha sonra j ++ yerine invalidBase değerini artırın. Bu yakın mı? ** BUNUN MIKECATS TUTULMADIĞINDAN SONRA KAPALI OLDUĞUNU DÜŞÜNÜYORUM! ** – Cole

+0

Hayır, bir dizi olduğu için ve geçersizse otomatik olarak bir dönüştürücü, bir lvalue değil, bir lvalue olarak kullanıldığında, geçersizBase'i artıramazsınız. “sizeof” veya unary '&' operator işlenenleri dışındaki ifadeler. – MikeCAT

+0

Bu "' if-else' ifadeleri yerine 'switch' deyimini kullanmak isteyebilirsiniz. – MikeCAT

cevap

3

Yoy belirsiz otomatik depolama süresi olan başlatılmamış değişkenlerin değerlerini kullanarak tanımsız davranış çağrılır.

geliştirmek için:

  • Artım veri invalidBase depolandığı takdirde karşı j.
  • Yazdırılacak uzunluğu belirlemek için j kullanın.

Geliştirilmiş kod: Bu birçok if-else tabloların yerine switch deyimi kullanabilirsiniz

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); 
} 

Not. Bu konuda daha fazla düşünme sonra elimizde

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

Tanrı seni seviyorum <3. Böyle aptal bir hata. Teşekkürler .... Buna sonsuza kadar baktım. Döngüleri yanlış bir şey yaptığımı düşünürsek, iç içe içine çok fazla araştırma yapıyordum. Teşekkürler <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! Bunu severim! Çok teşekkür ederim! Çok temiz. Ayrıca, otomatik olarak \ 0 ekledim? İşaretçiye hiç eklemedim! – Cole

+0

tolower() 'ın bu kullanımı, aralık dışı değeri geçmek için * tanımlanmamış davranışı * çağırabilir. Geçmeden önce '' işaretli '' imzalı char' '' a basmak onu engellemekte iyidir. – MikeCAT