qq_17440249 2021-05-19 23:57 采纳率: 100%
浏览 84
已结题

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];
	
  • 写回答

2条回答 默认 最新

  • CSDN专家-Time 2021-05-20 00:55
    关注
    #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

    第二行自己写。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 Macbookpro 连接热点正常上网,连接不了Wi-Fi。
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 linux驱动,linux应用,多线程
  • ¥20 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题