检查char数组是否以某些字符开头

时间:2013-11-08 18:37:12

标签: c

我需要编写的代码让用户输入一个存储在char数组中的mRna链。这个mRNa链必须以字符'a','u','g'开头。我无法弄清楚如何验证这是否属实。我想要获得整数值的总和并测试它但我不能这样做,因为它匹配可以输入的另外3个字母的字母。

另外,每三个字母翻译成氨基酸。我不知道如何取每个三个字母并翻译它。

我的第二个问题的一个例子 mRNA串是 auguuuauu

对蛋氨酸的编码。

用于苯丙氨酸的uuu代码。

auu代码为异亮氨酸。

所以程序会在读取每组3并进行翻译的情况下进行。然后将值存储在字符数组中。我正在考虑这样做的方法是创建一个循环,一次将3个值存储到char数组中。我不知道如何使用char数组分析该值是什么,并将其更改为需要的值。一旦改变了,我就会把它拖到最后。

3 个答案:

答案 0 :(得分:6)

好吧,如果你知道它是前三个,你可以随时这样做:

char *strand;

// load string in there

if (3 >= strlen(strand) && ( strncmp("aug",strand,3) == 0 )) {
    // do stuff
}

然后,你有确认。

如果您需要处理不同的顺序,也许您可​​以澄清您的问题。

编辑:

如果你需要其中一个:

char *strand;

// load string in there

if (3 >= strlen(strand) && 
      (   strncmp("aug",strand,3) == 0
       || strncmp("agu",strand,3) == 0
       || strncmp("gau",strand,3) == 0
       || strncmp("gua",strand,3) == 0
       || strncmp("uga",strand,3) == 0
       || strncmp("uag",strand,3) == 0 )
{
    // do stuff
}

如果您需要对这些字母进行任何排列:

char *strand;
int matchCount = 0;

// load string in there

if (3 >= strlen(strand))
{
    switch (strand[0])
    {
        case 'a':
        case 'u':
        case 'g':
            matchCount++;
            break:
    }
    switch (strand[1])
    {
        case 'a':
        case 'u':
        case 'g':
            matchCount++;
            break:
    }
    switch (strand[2])
    {
        case 'a':
        case 'u':
        case 'g':
            matchCount++;
            break:
    }
}

if (3 == matchCount) {
    // do stuff
}

好的,鉴于您的更新,这是第二个问题的解决方案。

#define METHIONINE    "aug"
#define PHENYLALAINE  "uuu"
#define ISOLEUCINE    "auu"

#define UNDEFINEDVALUE     0
#define METHIONINEVALUE    1
#define PHENYLALAINEVALUE  2
#define ISOLEUCINEVALUE    3

#define NUMBEROFACIDS  256

char *strand,*strandItr;
int aminoAcidList[NUMBEROFACIDS]={UNDEFINEDVALUE};
int aminoAcidCount = 0;
unsigned int i = 0;

// load string in there

if ((strlen(strand) % 3)) != 0)
{
    // your string doesn't only have these three-long amino acids
}

aminoAcidCount = strlen(strand)/3;

for (i = 0; i < aminoAcidCount; i++)
{
    if (strncmp(METHIONINE,(strand + i*3),3) == 0)
    {
        aminoAcidList[i] = METHIONINEVALUE;
    }
    else if (strncmp(PHENYLALAINE,(strand + i*3),3) == 0)
    {
        aminoAcidList[i] = PHENYLALAINEVALUE;
    }
    else if (strncmp(ISOLEUCINE,(strand + i*3),3) == 0)
    {
        aminoAcidList[i] = ISOLEUCINEVALUE;
    }
}

// do other stuff

for (i = 0; i < aminoAcidCount; i++)
{
    switch (aminoAcidList[i])
    {
        case METHIONINEVALUE:
            printf ("Methionine\n");
            break;
        case PHENYLALAINEVALUE:
            printf ("Phenylalaine\n");
            break;
        case ISOLEUCINEVALUE:
            printf ("Isoleucine\n");
            break;
        case UNDEFINEDVALUE:
        default:
            printf ("Unknown amino acid\n");
            break;
    }
}

答案 1 :(得分:2)

您可以使用strncmp(3)来比较两个字符串的开头:

if (strncmp(mRNAstrand, "aug", 3) == 0)

答案 2 :(得分:0)

关于第一个问题,请写下:

if (!(*mRna == 'a' || *mRna == 'u' || *mRna == 'g'))
    //Handle wrong array

你应该为你的第二个问题提供一个代码示例,以便更清楚你遇到的问题。