2012-01-17 15 views
0

好的 - 是的,这是作业,但它不是我的。我有一位朋友参加了一个介绍性的C++课程,他向我求助,并帮助他们编写了这个程序,但有一个奇怪的错误,我无法弄清楚。任何有用的建议将不胜感激。谢谢!!C++ Int在不应该改变它的函数后获得随机值

以下是代码。问题是,在add_loop函数之后,int loop_size会得到一个随机值。在函数中,它具有它应该具有的价值,但之后它会发生变化。

#include <iostream> 
#include <string> 
#include <stdlib.h> 
#include <time.h> 

using namespace std; 
#define STRING_SIZE 50 

void get_template (char StemLoop []) 
{ 
    char Template [STRING_SIZE]; 
    cout<<"Please enter a template for the stem:"; 
    cin>> Template; 
    strcpy (StemLoop, Template); 
} 

void add_loop (char StemLoop[], int loop_size) 
{ 

    char random_loop [STRING_SIZE]; 

    int random_array[STRING_SIZE]; 

    for (int i=0; i<loop_size; i++) 
    { 
     random_array[i] = rand() % 4; 
     if (random_array[i]==0) 
      random_loop[i]='A'; 
     else if (random_array[i]==1) 
      random_loop [i]='U'; 
     else if (random_array[i]==2) 
      random_loop [i]='G'; 
     else if (random_array[i]==3) 
      random_loop [i]='C'; 

    } 
    strcat (StemLoop, random_loop); 
} 

void add_complement(char StemLoop[], int loop_size) 
{ 

    int x =strlen(StemLoop); 
    int j=0; 
    char complement [STRING_SIZE]=""; 
    for (int i=0; i<(x-loop_size); i++) 
    { 
     if (StemLoop[i]=='A') 
      complement[j]='U'; 
     else if (StemLoop[i]=='U') 
      complement[j]='A'; 
     else if (StemLoop[i]=='G') 
      complement[j]='C'; 
     else if (StemLoop[i]=='C') 
      complement[j]='G'; 
     j++; 
    } 
    strcat(StemLoop,complement); 
} 

void main() 
{ 
    int loop_size=0; 
    cout<<"Please enter the size of the loop: "; 
    cin>>loop_size; 

    char StemLoop [STRING_SIZE]; 

    //Part1: the template 
    get_template (StemLoop); 

    //This is supposed to be the function that adds the loop of random "genes". 
    //It works, and within it the int loop_size is the correct value... 
    add_loop (StemLoop, loop_size); 
    /*...but here it is a random number. It's as if the random value generated 
    within the function is getting assigned to it. And of course, it's throwing off the 
    entire program. 
    */ 

    //Part#3: the complement 
    add_complement (StemLoop, loop_size); 
    cout<<"The complete stem-loop strand is:"<<StemLoop<<endl; 
} 
+0

您输入的模板大小是多少。你几乎肯定会在某处发生堆栈溢出,因为你没有正确地检查一些限制或其他限制。 –

+3

我正在辅导她。我没有“为她做功课”。而且我也不要求你也这样做。只是为了帮助我找到一个小小的错误。 – BIU

+0

(这是回复评论,从那以后被删除) – BIU

回答

3

你不是0终止random_loopstrcat使用它之前,这样strcat可以写在你的堆栈。试试这个:

random_loop[i] = 0; 
strcat (StemLoop, random_loop); 

更严重的问题可能是你不检查你有足够的空间来strcat

+0

我认为缺少0终止是这里的问题。请记住,数组默认情况下在定义时不会填充零,因此您必须手工完成此操作(或让for循环的最后一次执行终止字符串)。 – SvenS