【问题标题】:Strcpy not working for the first line of loop after mac OS updatesmac OS 更新后,Strcpy 不适用于第一行循环
【发布时间】: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 返回一个指向自动存储的指针。

标签: c strcpy


【解决方案1】:

我实际上并不确定这是否与 mac OS 有关 更新,但我有一个适用于 10.6 计算机的 C 代码,但不是 其他两台 10.10 和 10.11.6 的 macbook。

自创建以来,C 的工作方式相同。计算机以同样的方式读取它。 像 kaylum 一样,我认为问题出在代码本身而不是计算机/版本/操作系统/等

【讨论】:

  • 没错,我只是说int垃圾;垃圾 += 5;垃圾还是垃圾+5……标准不加垃圾?如果我错了,请纠正我,我就是要学习
  • 好像我评论了一个删除他评论的人?
  • 我删除了我的评论,因为这个链接比我的简短评论要好得多stackoverflow.com/questions/2397984/…
  • 感谢链接和 cmets 家伙。你能看看我编辑的问题,看看我现在是否有足够的信息?
  • 我只能说:如果你想避免将来遇到类似的错误,永远不要期望来自非初始化变量的任何东西,不要使用静态字符数组(如果你的数组可以有很多大小),你只是在推动一个新问题,如果“char target[1000];”你必须在以后解决这个问题。必须再包含一个字符,例如,您想重新编译所有内容吗?谷歌“malloc”和“free”明智地使用它们,它们是朋友,而不是敌人
【解决方案2】:

您将复制的字符串存储到堆栈分配的数组char target[1000]。您需要使用malloc 和朋友为该存储进行堆分配,并将其用于返回。在 copy_substr 返回时和之后未定义现有 target 的元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 2015-04-26
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多