c语言新手问题,为什么我这里数组中的元素会和变量j一同变动。

题目是输入两串配对的DNA字符串(长度100以内),在CCCGGG处中间切断然后让切断后的各子串从最后一个开始依次相连。我目前遇到的问题在前半段,我想用如下的代码标出各需要切割的点的位置(标号在6个字母里的4个),存储在数组p中。(之后将数组p内元素排序并求出每个切割后子串的长度)。但是如下代码我在实际运行中却出现了p[1]和j同时变化的境况。举例,我输入

“CCCGGG

 GGGCCC"

即将执行p[n++]=j+3后,理论结果应为p[1]=3,j=0,pn=2吧。但是我调试结果xian'sj同p[1]一起变成了3,之后随着循环变化j变回了0,然后p[1]此时也跟着变回了0,两者一起变化之后也有发生。所以这个问题是出在哪里了呢?自己发现原因了。是因为p,l两个数列没有声明长度。

 

#include <stdio.h> 
#include <math.h> 
char in[2][101],out[2][101];
char *to[2],*sub[2];
char window[6]={'C','C','C','G','G','G'};
int i,len,j,wj,wn,t,q;
int p[],l[];
int pn = 0;
int main( ) 
{   
	gets(in[0]);  
	gets(in[1]);
	len=strlen(in[0]);
	p[pn++]=0;
	for (i=0;i<2,i++){
		for (j=0;j<(len-5);j++){      //找出断点,右侧标号 
			wj=j;wn=0;
			while (in[0][wj] == window[wn]){
				wj++;wn++;
				if (wn==6){
					p[pn++] = j + 3;	
					break;
				}
			}
		} 
	}
	
	for (i=0;i<pn-1;i++){      //排序 
		t=i;
		for (j=i+1;j<pn;j++){
			if (p[wj]>p[j]) 
			t=j;
		}
		if (t != i){
		q=p[t]; p[t]=p[i]; p[i]=q;	
		}
	}  
	  
	for (i=0;i<pn-1;i++){      	//每子串长度
		l[i]=p[i+1]-p[i];
	} 
	l[pn-1]=len-p[pn-1];
	

 

#include <vector>
#include <stdio.h>
#include <string>
using namespace std;
#pragma warning(disable:4996)
int main() {
	vector<int> points;
	vector<string> list;
	char a[100];
	char b[100];
	string CheckA = "CCCGGG";
	string CheckB = "GGGCCC";
	string A;
	string B;
	scanf("%s", &a);
	//scanf("%s", &b);
	A = a;
	B = b;
	int j = 0;
	for (int i = 0; i < A.length(); i++) {
		for (j = 0; j < CheckA.length(); j++) {
			if (i >= A.length()) {
				break;
			}
			if (A[i] == CheckA[j]) {
				//向右偏移
				i++;
			}
			else {
				j = -1;
				i++;
			}
		}
		if (j == 6) {
			printf("断点:%d", i - 3);
			points.push_back(i - 3);
			j = -1;
		}
	}
	int start = 0;
	for (int i = 0; i < points.size(); i++) {
		string res = A.substr(start, points[i]-start);
		printf("根据断点截获字符串:%s\n", res.data());
		list.push_back(res);
		start = points[i];
	}
	string res = A.substr(start, A.length() - start);
	printf("根据断点截获字符串:%s\n", res.data());
	list.push_back(res);
	//
	printf("结果字符串:\n");
	for (int i = list.size()-1; i >= 0; i--) {
		printf("%s", list[i].data());
	}
	printf("结束!:\n");
}
ACCCGGGTCCCGGGTT
断点:4断点:11根据断点截获字符串:ACCC
根据断点截获字符串:GGGTCCC
根据断点截获字符串:GGGTT
结果字符串:
GGGTTGGGTCCCACCC

第二行自己写。

实际上要做匹配没这么麻烦。你直接用两个数组存碱基序列。

然后,每一个位置一一对应不就好了。、'

int i = 0;
char A[100];
char B[100];
scanf("%s",A);
scanf("%s",B);
bool flag = true;
while(flag || i<length){
    if(A[i]=='C')
    {
        flag = B[i] == 'G'? true:false;
    }
    i++;
}

你上面那一些拗口难懂。

建议编写易于读写的,可供维护的代码。