0

我有一个我真的无法理解的问题。我是一个新手 C 程序员,我有一个大致是这样的程序:

void filetostr(FILE *, char *s[]);
void strtofile(char *s[], FILE *);
void XORstr(char *, int);
void XORtext(char *s[], int);
void printext(char *s[]);

int main(int args, char *argv[]) {

    char *s[MAXLENGTH];
    char ln[MAXLENGTH];

    FILE *input, *xorred, *rexorred, *out;

    input = fopen("input.txt", "r");
    filetostr(input, s);
    fclose(input);

    printext(s);

    XORtext(s, KEY);        
}

void filetostr(FILE *fp, char *s[]) {
    char ln[MAXLENGTH];
    char *p;
    int i = 0;

    while (fgets(ln, MAXLINE, fp)) {
        p = (char *) malloc(strlen(ln) * sizeof(char));
        strcpy(p, ln);
        s[i++] = p;
    }
}

void printext(char *s[]) {
    while (*s) {
        printf("%s", *s);
        s++;
    }
}

void XORstr(char *s, int key) {
    int c;
    while (c = *s)
        *s++ = key ^ c;
}

void XORtext(char *txt[], int key) {
    while (*txt) {
        XORstr(*txt, key);
        txt++;
    }
}

我有两个两个问题:

  • 首先,当我用 构建指向字符串的指针数组时filetostr,我让它工作,但文本中间的两行重复(数组中有两个对它们的引用,因此printext它们被打印两次)。这怎么可能?对 malloc 的调用是否错误?
  • 其次,当我尝试对我刚才提到的行进行异或运算时,它们只会异或一次,所以我最终得到一个异或行,每个重复行都有一个正常的行。
4

2 回答 2

3
 p = (char *) malloc((strlen(ln) + 1) * sizeof(char));

代替

 p = (char *) malloc(strlen(ln) * sizeof(char));

顺便说一句,你可以改变

p = (char *) malloc((strlen(ln)+1) * sizeof(char));
strcpy(p, ln);
s[i++] = p;

经过

s[i++] = strdup(ln)

一样的

于 2013-01-10T15:43:11.517 回答
1

里面不太对mallocfiletostr它应该是

p = malloc(strlen(ln) + 1);

您需要为终止空字符分配空间,不需要强制转换返回并且可以依赖sizeof(char)为 1

于 2013-01-10T15:43:45.463 回答