2016-02-07 3 views
4

Я программировал на C, чтобы решить проблему на веб-сайте ROSALIND. код очень прост, а потому, что это так просто, это очень трудно исправить эту ошибку (я думаю) Вот мой код:.C - error after for() cicle

/* 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(), чтобы найти место ошибки. Я видел это в тот момент, как прямо перед тем, как выйти из цикла nA = 20, но момент сразу после него nA = 4200624. Что мне делать?

+1

Почему вы ограничиваете себя 1000 входами? Это очень неестественный способ структурирования кода. Типично читать до тех пор, пока 'getchar' не вернет EOF. –

+0

Предел составляет 1000, если вы читаете заголовок. – MoonWalker

ответ

10

Я считаю, что это связано с тем, что вы обновляете переменные в заголовке for, где вы устанавливаете переменную в 0. Поскольку вы объявляете nA сразу после i, вы создали новую переменную с тем же именем, но с разным объемом. Это видно только в цикле for, но уничтожается после его завершения. Другие переменные правильно инициализируются из-за вашей цепочки заданий. То есть они инициализируются, а не переоформляются. Инициализация переменных в той же строке, что и вы их объявили, решит проблему.

+0

Очень хорошо - мне пришлось скомпилировать его, чтобы определить это. Мой компилятор 'clang', жалуется на инициализацию * first *, а затем на * last *' printf', но не те, что находятся между ними. Это позволило мне более внимательно рассмотреть линию 'for'. – usr2564301

+0

Спасибо! Это очень помогло. Не знал этого. Я принимаю это как ответ, когда stackoverflow позволяет мне. – MoonWalker

2

Повысьте свои предупреждения о компиляторе. У вас есть две переменные с именем «nA», одна из которых является локальной для цикла, а другая - неинициализирована и что вы печатаете в результате.

Смежные вопросы