에 strncmp와 각 행을 비교 :이는 fgets와 파일에서 라인을 읽고 나는 이런 식으로 뭔가 보이는 파일에서 모든 라인을 읽을 수 C
readEveryLine
{
"Bart [m]" -> "Marge [f]";
"Lisa [f]" -> "Homer [m]";
...
}
내가 사용하려는를 :
- 는 fgets()는 선으로
- strncmp를 (파일 라인을 읽는) 주어진 문자열로 모든 라인을 비교하거나 그냥 올바른 형식을 가지고 볼 수
내가 무엇을 :
while(fgets(*file_string, MAX_INPUT_STDIN, file) != NULL)
{
changeLastC(*file_string); // function to change \n into \0
if (strncmp(*file_string, "readEveryLine\0", 14) == 0)
{
if (strncmp(*file_string, "{\0", 2) == 0)
{
// check the first -> relation
}
}
else
{
printf("Error Parsing\n");
}
}
그렇게 문제가 그냥 나에게 오류 구문 분석을 제공하고 내가 잘못 여기에 무슨 짓을했는지 모르겠어요 것입니다.
나를 도와 주셔서 감사합니다.
여기에 나는 지금 몇 가지를 만들었습니다. (처음 두 줄을 파싱하면됩니다.) 어쩌면 누구든지 저를 위해서 좋은 조언을 얻었을 것입니다. 고마워요.
if ((fp = fopen("df.dot","r")) == NULL)
{
printf("Error: File Open\n");
return 1;
}
int row = 0; // check row 1
while (fgets(buffer, MAX_PARSING, fp))
{
if ((row == 0) && strncmp(buffer, "readEveryLine\n", 14) == 0)
{
printf("%s", buffer);
}
else
{
printf("Parsing Error 1\n");
}
}
int row1 = 1; // check row 2
while (fgets(buffer, MAX_PARSING, fp))
{
if ((row1 == 1) && strncmp(buffer, "{\n", 2) == 0)
{
printf("%s", buffer);
}
else
{
printf("Parsing Error 2\n");
}
}
int row2 = 2; // check other rows (dynamic, could be even more or less)
while (fgets(buffer, MAX_PARSING, fp))
{
if ((row2 == 2) && strncmp(buffer, " ", 2) == 0)
{
const char *p1 = strstr(fp, "\"")+1;
const char *p2 = strstr(p1, " [m]\"");
const char *p3 = strstr(p1, " [f]\"");
// extract male persons
if (p1 && p2)
{
size_t len1 = p2 - p1;
char* res1 = (char*)malloc(sizeof(char)*(len1 + 1));
strncpy(res1, p1, len1);
res1[len1] = '\0';
// give res1 for functionMale() to work on that string
}
// extract female persons
else if (p1 && p3)
{
size_t len2 = p3 - p1;
char* res2 = (char*)malloc(sizeof(char)*(len2 + 1));
strncpy(res2, p1, len2);
res2[len2] = '\0';
// give res2 for functionFemale() to work on that string
}
else if (strcmp(buffer, " -> ") == 0)
{
// work in progress (quite complicated to do this i think)
// it has to be a realtion between two people
}
else if (strcmp(buffer, ";") == 0)
{
// work in progress
// this sign can either exist like this:
// "Bart [m]" -> "Marge [f]";
// or like this:
// "Marge [f]";
}
break;
}
else
{
printf("Parsing Error 3\n");
}
row2++;
}
// 그리고 맨 마지막 기호가 있어야한다} \ n
1)'string'과'changeLastC()'의 정의를 정의하십시오. 2) 컴파일러 경고가 완전히 활성화되도록하십시오. 3)''readEveryLine \ n "'이"readEveryLine "'과 같을 까 기대하는 이유는 무엇입니까? 그렇지 않으면 문제가 잘 정의되어 있지 않습니다. – chux
왜 당신은'strncmp'를 사용하고 싶습니까? 이 목적을위한 올바른 함수는'strcmp '입니다. – rici
@chux, 줄 끝에 '\ n'이 없습니다. 주석에 따르면'\ n'은'changeLastC() '함수에 의해'\ 0'으로 변경됩니다. – Gerhardh