在某些字符串的末尾获取垃圾值

时间:2015-10-24 06:52:10

标签: c string file-handling

我抓了一个网站来获得一些mcqs用于c任务。我将数据写入一个纯文本文件,用空字符分隔每个条目。 模式是: Question with choices NULL Answer NULL Question...

以下是该文件的示例。红点是'\0'字符:

enter image description here Here是获取完整档案的链接。

在C 中读取此文件的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Question{
    char question[1000];
    char answer;
};

int main(){
struct Question questions[100];
FILE *fp;
char buffer[1000],choice;
int ch,i=0,c=1,k=0,score=0;
fp=fopen("quiz_questions.txt","r");
ch = 1;
  while (ch != EOF)
  {
    ch = getc(fp);
    buffer[i]=ch;
    i++;
    if(ch=='\0'){
    buffer[i]='\0';
    c++;
    i=0;
    continue;
    }
    if(c%2){ //question
    strcpy(questions[k].question,buffer);


    }
    else{ //answer
    questions[k].answer=buffer[0];
    k++;

    }
 }



for(i=0;i<35;i++){
printf("\nQuestion:\n%s\nAnswer: %c\n",questions[i].question,questions[i].answer);
}


return 0;
}

输出:

Output

我错过了什么?请帮忙。似乎缓冲区没有正确终止,并且保留了上次分配的字符。

PS:有没有更好的方法从c中使用这些数据?通过python完成刮擦。

编辑:我现在意识到编写一个单独的answerkey文件会好得多。愚蠢的我。

2 个答案:

答案 0 :(得分:2)

    strcpy(questions[k].question,buffer);

对于您阅读的每个字符执行此语句(如果c为奇数)。此时,buffer尚未终止(而不是字符串)。

ch = getc(fp);
buffer[i]=ch;

即使到达文件末尾,这两行也会写入buffer[i]。您只需在处理完{1}}后检查它是否为普通字符。

EOF

这是多余的。如果i++; if(ch=='\0'){ buffer[i]='\0'; ch,则您'\0'中的buffer空终止了buffer[i]=ch;。无需添加其他'\0'

答案 1 :(得分:1)

修改版本的代码以解决问题:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Question{
    char question[1000];
    char answer;
};

int main()
{
    struct Question questions[100];
    FILE *fp;
    char buffer[1000],choice;
    int ch,i=0,c=0,k=0,score=0;    **<-- EDIT:change done here to initialize c = 0**

    fp=fopen("quiz_questions.txt","r");

    ch = 1;

    while (ch != EOF)
    {
        ch = getc(fp);
        buffer[i]=ch;
        i++;

        if(ch =='\0')
        {
            //buffer[i]='\0';  <-- Change done here, unnecessary assignment
            c++;
            i=0;

            if(c%2)            <-- Change done here, moved inside if (ch == '\0') case
            { 
                //question
                strcpy(questions[k].question,buffer);
            }
            else
            { 
                //answer
                questions[k].answer=buffer[0];
                k++;
            }
        }
    }


    for(i=0;i<35;i++)
    {
        printf("\nQuestion:\n%s\nAnswer: %c\n",questions[i].question,questions[i].answer);
    }

    return 0;
}