我正在尝试编写一个程序来确定字符序列是有效还是无效

时间:2017-03-07 21:04:25

标签: c

如果用户输入ACGT以外的任何字符(顺序无关紧要),则应打印“INVALID”。用户只需输入不超过250个字符的序列。

#include <stdio.h>
#include <string.h>
int main(void)
{
    char dna[250];
int i;
for(i=0; i<250; i++)
{
    scanf("%c", dna[i]);
}
fgets(*dna, 250, scanf("%c", dna));
int k;
for(k=0; k<250; k++)
{
    if(dna[k] == 'A' || 'C' || 'G'|| 'T')
    {
        i++;
        //printf("%c\n", dna[0])
    }
}
if(i > 0)
{
    printf("VALID sequence \n");
}
else
{
    printf("INVALID sequence \n");
}

}

2 个答案:

答案 0 :(得分:1)

像这样

#include <stdio.h>

int main(void){
    char dna[250+1], rest;
    if(scanf("%250[ACGT]%c", dna, &rest) == 2 && rest == '\n')
        printf("VALID sequence \n");
    else
        printf("INVALID sequence \n");
}

答案 1 :(得分:0)

有很多方法可以解决这个问题。您可以对显示的字符类使用scanf,也可以使用任何其他方法来读取输入(例如getcharfgets,POSIX getline),然后简单地分析为"ACGT"以外的任何内容输入的字符。

此外,在您的问题陈述中,您声明“用户只是不断输入不超过250个字符的序列”。显然,您需要循环来处理多个字符串的输入,但除此之外,您还需要保护并处理大于250个字符的任何字符串的剩余部分。目前还不清楚是否要保留输入的前250个有效字符(看起来是合乎逻辑的),然后丢弃任何超过250个字符的限制。

在使用面向字符的输入(例如使用getchar)的情况下,用于验证输入的工具只是检查针对ACGT的每个字符输入。当使用面向行的输入时(例如fgetsgetline),C库提供了许多工具来检查字符串中的字符或字符串中的子字符串( strchr适用于此处)或者您可以简单地将指针向下移动检查每个字符的整个输入字符串。 (您还需要检查并删除'\n'面向行的函数read 并在缓冲区中包含

使用fgets作为输入和strchr将这些部分组合成一个简短示例,以检查每个字符是否为ACGT之一,您可以执行以下操作。这里用户可以根据需要输入任意数量的字符串。读取EOF时程序终止(在Linux上用 Ctrl + D 手动生成,在windoze上用 Ctrl + Z 手动生成)。如果输入的字符串无效,则代码将标识条目中第一个无效字符的位置:

#include <stdio.h>
#include <string.h>

#define MAXC 250

int main (void) {

    char str[MAXC+1] = "", *valid = "ACGT";

    printf ("Enter sequences [ctrl+d] to quit:\n");
    while (fgets (str, MAXC+1, stdin))          /* read input */
    {
        size_t len = strlen (str), good = 1;    /* get length, set flag */
        char *p = str;                          /* pointer to str */
        int c;

        if (str[len-1] == '\n')                 /* trim '\n' char */
            str[--len] = 0;                     /* overwrite with nul */
        else                                    /* line > 250, discard extra */
            while ((c = getchar()) != '\n' && c != EOF) {}

        for (; *p; p++)                         /* for each char in str */
            if (!strchr (valid, *p)) {          /* check against valid  */
                good = 0;                       /* not found - invalid */
                break;
            }

        if (good)
            printf ("VALID\n");
        else
            fprintf (stderr, "INVALID ('%c' at character '%ld'\n", *p, p - str);
    }

    return 0;
}

示例使用/输出

$ ./bin/acgtvalid
Enter sequences [ctrl+d] to quit:
ACGTTTGGCCCATTAGGC
VALID
ACCGGTTCCGGAITT
INVALID ('I' at character '12')