【问题标题】:C - error after for() cicleC - for() 循环后的错误
【发布时间】:2016-02-07 23:25:33
【问题描述】:

我一直在用 C 编写代码来解决 ROSALIND 网站上的一个问题。 代码真的很简单,而且因为它很简单,所以很难纠正这个错误。(我猜) 这是我的代码:

    /* A string is simply an ordered collection of symbols selected from some alphabet and formed into a word; the length of a string is the number of symbols that it contains.

An example of a length 21 DNA string (whose alphabet contains the symbols 'A', 'C', 'G', and 'T') is "ATGCTTCAGAAAGGTCTTACG."

Given: A DNA string s of length at most 1000 nt.

Return: Four integers (separated by spaces) counting the respective number of times that the symbols 'A', 'C', 'G', and 'T' occur in s. */

#include <stdio.h>

int main(){
    char nt;
    int nA, nC, nG, nT;
    for(int i = 0, nA = nC = nG = nT = 0; i < 1000; i++){
        nt = getchar();
        if(nt == 'A'){
            nA++;
        }else if(nt == 'C'){
            nC++;
        }else if(nt == 'G'){
            nG++;
        }else if(nt == 'T'){
            nT++;
        }else{
            break;
        }
    }
    printf(" %d %d %d %d", nA, nC, nG, nT);
}

当我测试这段代码时:

AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC

它应该给出:

20 12 17 21

但是我的电脑给了:

4200624 12 17 21

我已经使用 printf() 函数来查找错误所在的位置。我在离开 cicle nA = 20 之前的那一刻看到了这一点,但在它之后的那一刻 nA = 4200624 。 我能做什么?

【问题讨论】:

  • 为什么将自己限制为 1000 个输入?这是一种非常不自然的代码结构方式。在 getchar 返回 EOF 之前阅读更为典型。
  • 如果您阅读标题,则限制为 1000 长度。

标签: c for-loop


【解决方案1】:

我相信这是因为您在 for 标头中重新声明变量,将变量设置为 0。由于您在 i 之后立即声明 nA,因此您创建了一个具有相同名称的新变量,但是具有不同的范围。这个仅在 for 循环本身中可见,但在结束后被销毁。由于您的分配链,其他变量已正确初始化。 IE。它们被初始化,而不是重新声明。在声明变量的同一行中初始化变量可以解决问题。

【讨论】:

  • 非常好——我必须编译它才能发现这一点。我的编译器 clang 抱怨 first 初始化,然后是 last printf 行,但不是介于两者之间的那些。这让我仔细查看了for 行。
  • 谢谢!它有很大帮助。不知道那个。当stackoverflow允许我时,我会接受它作为答案。
【解决方案2】:

打开编译器警告。您有两个名为“nA”的变量,一个是循环本地的,另一个是未初始化的,因此您正在打印。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 2019-01-02
    • 2022-06-13
    相关资源
    最近更新 更多