C 嵌套的if-else语句给我带来了问题
我编写的代码应该计算字符指针列表中a、c、t和g的数量。然后,如果输入的字符不是a、c、t或g,则应将无效字母添加到字符列表invalidBase中。相反,当我输入数据agtcpoop时,它打印出无效的基:但是字符不在那里,当它应该打印出poop时。请帮忙!代码如下: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
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;
}