【发布时间】:2017-03-31 10:02:15
【问题描述】:
为清楚起见,编辑了之前草率的问题。
编辑:这是我使用的代码的简短版本。如果我包含一些不必要的信息,我深表歉意(我对 C 不太熟悉)。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#define SEQ 200
#define POS 100
char *copy_substr (char *source, int start, int end){
int x,y;
char target[1000];
for (x=0; x<sizeof(target); x++)
target[x]='\0';
for (x=start, y=0; x <= end; x++, y++)
target[y]=source[x];
return(target);
}
main(){
char seq[SEQ][POS];
int no=0;
char garbage[1000];
int x,y,z,i,j;
int len;
/* Reads in alignment file from stdin */
while (fgets(garbage, sizeof(garbage), stdin)){
x=0;
/* Finds boundaries */
while (garbage[x++] == ' ');
while (garbage[x++] != ' ');
while (garbage[x++] == ' ');
y=--x;
while(isalpha(garbage[x]) || garbage[x] == '.' || garbage[x] == '-')
x++;
x--;
printf("*%d %d %d*",no,x,y);
printf("%s",garbage);
strcpy(seq[no], copy_substr(garbage, y, x));
printf("%s\n",seq[no]);
no++;
}
len=strlen(seq[0]);
}
输入文件:
4322822 PLP.......PG...WEIKIDPQTGWPFFVDHNSRTTTWNDPRVP
3560257 GLP.......KP...WIVKISRSRNRPYFFNTETHESLWEPPAAT
3046716 PLPNLGQSVKPP...WERATTAAN.VPYYIDHERQTTHWDHPEMI
3875252 PLP.......SG...WECITMNN.RTVFLNHANKETSFYDPRIRR
2827198c PLP.......EG...WEMRFTVD.GIPYFVDHNRRATTYIDPRTG
2708329c PLP.......EG...WEMRFTVD.GIPYFVDHNRRTTTYIDPRTG
3875841 PMP.......QG...WEMCYDSD.GVRYFKDHNSKTTTWDDPRLK
1171682d GLP.......PG...WEEKQDER.GRSYYVDHNSRTTTWTKPTVQ
2072503d ALP.......AG...WEQRELPN.GRVYYVDHNTKTTTWERPLPP
3411053b ELP.......YG...WEKIDDPIYG.TYYVDHINRRTQFENPVLE
输出:
*0 58 14* 4322822 PLP.......PG...WEIKIDPQTGWPFFVDHNSRTTTWNDPRVP
|=҇
*1 58 14* 3560257 GLP.......KP...WIVKISRSRNRPYFFNTETHESLWEPPAAT
GLP.......KP...WIVKISRSRNRPYFFNTETHESLWEPPAAT
*2 58 14* 3046716 PLPNLGQSVKPP...WERATTAAN.VPYYIDHERQTTHWDHPEMI
PLPNLGQSVKPP...WERATTAAN.VPYYIDHERQTTHWDHPEMI
*3 58 14* 3875252 PLP.......SG...WECITMNN.RTVFLNHANKETSFYDPRIRR
PLP.......SG...WECITMNN.RTVFLNHANKETSFYDPRIRR
*4 58 14* 2827198c PLP.......EG...WEMRFTVD.GIPYFVDHNRRATTYIDPRTG
PLP.......EG...WEMRFTVD.GIPYFVDHNRRATTYIDPRTG
*5 58 14* 2708329c PLP.......EG...WEMRFTVD.GIPYFVDHNRRTTTYIDPRTG
PLP.......EG...WEMRFTVD.GIPYFVDHNRRTTTYIDPRTG
*6 58 14* 3875841 PMP.......QG...WEMCYDSD.GVRYFKDHNSKTTTWDDPRLK
PMP.......QG...WEMCYDSD.GVRYFKDHNSKTTTWDDPRLK
*7 58 14* 1171682d GLP.......PG...WEEKQDER.GRSYYVDHNSRTTTWTKPTVQ
GLP.......PG...WEEKQDER.GRSYYVDHNSRTTTWTKPTVQ
*8 58 14* 2072503d ALP.......AG...WEQRELPN.GRVYYVDHNTKTTTWERPLPP
ALP.......AG...WEQRELPN.GRVYYVDHNTKTTTWERPLPP
*9 58 14* 3411053b ELP.......YG...WEKIDDPIYG.TYYVDHINRRTQFENPVLE
ELP.......YG...WEKIDDPIYG.TYYVDHINRRTQFENPVLE
预期输出:
*0 58 14* 4322822 PLP.......PG...WEIKIDPQTGWPFFVDHNSRTTTWNDPRVP
PLP.......PG...WEIKIDPQTGWPFFVDHNSRTTTWNDPRVP
*1 58 14* 3560257 GLP.......KP...WIVKISRSRNRPYFFNTETHESLWEPPAAT
GLP.......KP...WIVKISRSRNRPYFFNTETHESLWEPPAAT
*2 58 14* 3046716 PLPNLGQSVKPP...WERATTAAN.VPYYIDHERQTTHWDHPEMI
PLPNLGQSVKPP...WERATTAAN.VPYYIDHERQTTHWDHPEMI
*3 58 14* 3875252 PLP.......SG...WECITMNN.RTVFLNHANKETSFYDPRIRR
PLP.......SG...WECITMNN.RTVFLNHANKETSFYDPRIRR
*4 58 14* 2827198c PLP.......EG...WEMRFTVD.GIPYFVDHNRRATTYIDPRTG
PLP.......EG...WEMRFTVD.GIPYFVDHNRRATTYIDPRTG
*5 58 14* 2708329c PLP.......EG...WEMRFTVD.GIPYFVDHNRRTTTYIDPRTG
PLP.......EG...WEMRFTVD.GIPYFVDHNRRTTTYIDPRTG
*6 58 14* 3875841 PMP.......QG...WEMCYDSD.GVRYFKDHNSKTTTWDDPRLK
PMP.......QG...WEMCYDSD.GVRYFKDHNSKTTTWDDPRLK
*7 58 14* 1171682d GLP.......PG...WEEKQDER.GRSYYVDHNSRTTTWTKPTVQ
GLP.......PG...WEEKQDER.GRSYYVDHNSRTTTWTKPTVQ
*8 58 14* 2072503d ALP.......AG...WEQRELPN.GRVYYVDHNTKTTTWERPLPP
ALP.......AG...WEQRELPN.GRVYYVDHNTKTTTWERPLPP
*9 58 14* 3411053b ELP.......YG...WEKIDDPIYG.TYYVDHINRRTQFENPVLE
ELP.......YG...WEKIDDPIYG.TYYVDHINRRTQFENPVLE
请注意,copy_substr 不适用于输入的第一行(输出的第二行与预期输出的第二行不匹配)。
【问题讨论】:
-
这不太可能与您的 macbook 版本有任何直接关系。您的代码中更有可能存在错误。但除非您提供minimal reproducible example,否则我们无法为您提供帮助。
-
建议:使用
strncpy而不是strcpy以避免缓冲区溢出。不是说这是你的问题,因为没有足够的细节,但它可能是。 -
没有minimal reproducible example,我猜你有一个未定义或未指定的行为。两者在不同的环境中都会有不同的表现。你甚至可能有实现定义的行为。
-
copy_substr()本身如果写得不好也会导致这种情况。 -
copy_substr返回一个指向自动存储的指针。