我在用**括起来的线路上遇到分段故障。我通过管道传输此输出:|状态: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处理。