c-新线后的分段故障



我在用**括起来的线路上遇到分段故障。我通过管道传输此输出:|状态:OK||版本:0.85||作者:PBrooks||nitems:0|

在下面的代码中,在我打印出printf语句中的'\n'后,它会给我一个分段错误。不过我不知道如何调试它。。有人知道线索吗?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <time.h> 

char string[300];
struct NameValue {
    char *name;
    char *value;
};
struct NameValue *pairs;
void ReadStdin(int argc, char *argv) {
    int x;
    fread(string, sizeof (char), 300, stdin);
    printf("%sn", string);
}
void ParseInput() {
    int x, num = 0; //figure out how many i need 
    for (x = 0; x < 300; x++) {
        if (string[x] == '|') {
            num++;
        }
    }
    num /= 2; //num = how many i need 
    pairs = (malloc(num)); //allocate the array 
    int pipe = 0, i, j = 0, tempCounter = 0;
    char tempName[50], tempValue[50];
    printf("%lu n", sizeof (string) / sizeof (string[0]));
    if (pairs != 0) {
        for (i = 0; i <= num; i++) { //counts pairs 
            printf("i = %in", i);
            printf("j = %i, pipe: %i n", j, pipe);
            if (string[j] == '|') {
                printf("there's a pipen");
                pipe++;
                j++;
            }
            while (string[j] != ':') {
                printf("counter for main string: %in tempCounter: %in", j, tempCounter);
                tempName[tempCounter] = string[j];
                tempCounter++;
                j++;
                if (string[j] == ':') {
                    tempName[tempCounter] = '';
                    tempCounter = 0;
                    **printf("~~~~tempNamen is: %s", tempName);**
                    break;
                }
            }
            while (string[j] != '|') {
                j++;
                tempValue[tempCounter] = string[j];
                tempCounter++;
                if (string[j] == '|') {
                    tempValue[tempCounter] = '';
                    tempCounter = 0;
                    strcpy(pairs[i].value, tempValue);
                    pipe++;
                    break;
                }
            }
        }
    }
}
int main(int argc, char *argv) {
    ReadStdin(argc, argv);
    ParseInput();
    return (EXIT_SUCCESS);
}

编辑:对不起!我无意中删除了空终止字符行。它在里面,但它仍然给我错误。

edit:更多信息:在程序抛出分段错误之前,j变量增加到6,temp计数器增加到5。

您永远不会以null终止字符串tempName。然后你试着在这里打印:

if (string[j] == ':') {
    tempCounter = 0;
    **printf("~~~~tempNamen is: %s", tempName);**
    break;
}

C中的字符串是内存中的一系列字符,以空字节(即'')结尾。您正在将字节复制到缓冲区中,但您从未自己创建过这个null终止符,因此printf会从末尾运行到未定义的内存中。

相反,在while循环结束时,您需要将tempName中的下一个字符分配给'',可能是在打印之前的while循环内

tempCounter = 0之前,只需放置tempName[tempCounter] = '';

我想明白了。我不仅需要对这些对进行malloc,还需要对每个malloc对中的成员变量进行malloc。

最后,我使用我的tempCounter来查看我需要多少个字符,并对成员变量的正确数量进行malloc处理。

相关内容

  • 没有找到相关文章

最新更新