C 嵌套的if-else语句给我带来了问题

C 嵌套的if-else语句给我带来了问题,c,C,我编写的代码应该计算字符指针列表中a、c、t和g的数量。然后,如果输入的字符不是a、c、t或g,则应将无效字母添加到字符列表invalidBase中。相反,当我输入数据agtcpoop时,它打印出无效的基:但是字符不在那里,当它应该打印出poop时。请帮忙!代码如下: void countBase(char *p) { int aCount = 0, cCount = 0, tCount = 0, gCount = 0; char invalidBase[100]; int i

我编写的代码应该计算字符指针列表中a、c、t和g的数量。然后,如果输入的字符不是a、c、t或g,则应将无效字母添加到字符列表invalidBase中。相反,当我输入数据agtcpoop时,它打印出无效的基:但是字符不在那里,当它应该打印出poop时。请帮忙!代码如下:

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);
}
Yoy通过使用具有自动存储持续时间(不确定)的未初始化变量的值来调用未定义的行为

改善:

  • 仅当数据存储到invalidBase时,才增加计数器
    j
  • 使用
    j
    确定要打印的长度
改进代码:

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);
}
Yoy通过使用具有自动存储持续时间(不确定)的未初始化变量的值来调用未定义的行为

改善:

  • 仅当数据存储到invalidBase时,才增加计数器
    j
  • 使用
    j
    确定要打印的长度
改进代码:

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);
}
#包括
#包括
void countBase(字符*p){
int aCount=0,cCount=0,tCount=0,gCount=0;
字符无效基[100];
int i,j=0;
而(*p!='\0'){
如果(tolower(*p)==“a”){
aCount++;
}
如果(tolower(*p)='c'){
cCount++;
}
如果(tolower(*p)='t'){
t计数++;
}
如果(tolower(*p)='g'){
gCount++;
}
否则{
//这是增量j的正确位置。
无效数据库[j++]=*p;
}
//下一行是错误的。只有在无效的
//已找到基并将其插入阵列。
//j++;
p++;
}
//您的代码缺少“字符串结尾”定界。
无效数据库[j]='\0';
对于(i=0;无效数据库[i]!='\0';i++){
printf(“无效基:%c\n”,无效基[i]);
}
printf(“A:%i\n C:%i\n T:%i\n G:%i\n”,aCount,cCount,tCount,gCount);
}
int main(){
printf(“测试'%s'\n”,“agtcpoop”);
countBase(“agtcpoop”);
认沽权证(“*******************************************”);
printf(“测试“%s”\n”、“a”);
countBase(“a”);
认沽权证(“*******************************************”);
printf(“测试'%s'\n',”);
计数基(“”);
认沽权证(“*******************************************”);
printf(“测试'%s'\n”,“p”);
countBase(“p”);
返回0;
}
#包括
#包括
void countBase(字符*p){
int aCount=0,cCount=0,tCount=0,gCount=0;
字符无效基[100];
int i,j=0;
而(*p!='\0'){
如果(tolower(*p)==“a”){
aCount++;
}
如果(tolower(*p)='c'){
cCount++;
}
如果(tolower(*p)='t'){
t计数++;
}
如果(tolower(*p)='g'){
gCount++;
}
否则{
//这是增量j的正确位置。
无效数据库[j++]=*p;
}
//下一行是错误的。只有在无效的
//已找到基并将其插入阵列。
//j++;
p++;
}
//您的代码缺少“字符串结尾”定界。
无效数据库[j]='\0';
对于(i=0;无效数据库[i]!='\0';i++){
printf(“无效基:%c\n”,无效基[i]);
}
printf(“A:%i\n C:%i\n T:%i\n G:%i\n”,aCount,cCount,tCount,gCount);
}
int main(){
printf(“测试'%s'\n”,“agtcpoop”);
countBase(“agtcpoop”);
认沽权证(“*******************************************”);
printf(“测试“%s”\n”、“a”);
countBase(“a”);
认沽权证(“*******************************************”);
printf(“测试'%s'\n',”);
计数基(“”);
认沽权证(“*******************************************”);
printf(“测试'%s'\n”,“p”);
countBase(“p”);
返回0;
}

仔细考虑之后,我现在的猜测是,我需要在else语句中取消对invalidBase的引用?通过使用指针?例如,在else语句中使用be*invalidBase=*p;然后增加invalidBase而不是j++。离这儿近吗?我认为在得到MIKECATS的回复后,这是一个很好的选择!不,您不能递增
invalidBase
,因为它是一个数组,ih将自动转换为指针,而指针id不是左值,在表达式中使用时,除了
sizeof
或一元
&
运算符的操作数之外。您可能希望使用
switch
语句,而不是这些大量的
if-else
语句。@MikeCAT我尝试过,但我似乎在使用switch语句作为指针时遇到了问题。我在网上查了一下,找不到怎么做。也许我只是犯了一些愚蠢的错误,但我不确定。我在我的答案中添加了一个使用
switch
语句的代码。我现在想了想,是不是我需要在else语句中取消对invalidBase的引用?通过使用指针?例如,在else语句中使用be*invalidBase=*p;然后增加invalidBase而不是j++。离这儿近吗?我认为在得到MIKECATS的回复后,这是一个很好的选择!不,您不能递增
invalidBase
,因为它是一个数组,ih将自动转换为指针,而指针id不是左值,在表达式中使用时,除了
sizeof
或一元
&
运算符的操作数之外。您可能希望使用
switch
语句,而不是这些大量的
if-else
语句。@MikeCAT我尝试过,但我似乎在使用switch语句作为指针时遇到了问题。我在网上查了一下,找不到怎么做。也许我只是犯了一些愚蠢的错误,但我不确定。我在我的答案中添加了一个使用
switch
语句的代码。上帝我爱你上帝我爱你啊!我喜欢这个!非常感谢你!干净多了。另外,我认为它会自动添加\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;
}