被C语法搞糊涂了

时间:2010-12-03 09:27:05

标签: c syntax

我是c的新手,但仍然在语法上遇到麻烦,希望你能帮助我...因为我坚持这段代码

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

int main(void){
     FILE *stream = NULL;
     stream = fopen("studentinfo.txt", "a+");
     /*some of initialization were used for testing purposes only*/

     char arr[5];
     char arr2[5];
     int i;
     char name[3];
     char course[5];

     printf("enter details: ");
     scanf("%s", arr2);

     while(!feof(stream)){ 
        fgets(arr, 100, stream);//i am confused if the line capture was stored at arr[0]
        if(strcmp(arr, arr2)==0){//i want to compare
           printf("success");//testing
        }
        printf("%s", arr);//i wonder does fgets just overwrites the new line to arr[0]
     }

     fclose(stream);

     getch();
}

谢谢你们......

3 个答案:

答案 0 :(得分:6)

  1. 您正在打开studentinfo.txt进行追加,但随后从中读取(并且您没有检查打开成功
  2. 你为arr分配了5个字符,但是用fgets读取了最多100个字符。这将溢出并导致内存损坏
  3. 你为arr2分配了5个字符,但是在其中读取了一个任意数量的字符 - 这会溢出并导致内存损坏
  4. Fgets从arr开始将字符读入内存。 arr [0]是第一个字符。 &amp; arr [0]与arr
  5. 相同
  6. 最后的getch()是什么?
  7. 此外,“a +”将流定位在文件的末尾,因此您将无法阅读任何内容。

答案 1 :(得分:2)

如果您有现有文件......并且您的文件中包含数据。然后你可以检查你输入的数据是否存在于文件中。我不确定这是不是你想要的。

例如,如果您输入了... love 并且该文件还包含确切的单词... love(在一行上) 然后它将打印出“成功”。

如果你输入的数据不存在于文件中,它将被附加在文件上(在下一行)。

int main(void){

 char arr[5];
 char arr2[5];
 int i;
 int n=0;

 FILE *stream = NULL;
 FILE *append = NULL;
 stream = fopen("studentinfo.txt", "rt");
 append = fopen("studentinfo.txt", "a+");

 printf("enter details: ");
 scanf("%s", arr2);

 while(!feof(stream)){ 
    fgets(arr, 6, stream);
    if(strcmp(arr, arr2)==0){
       printf("success");
    } else n=-1;  
 }  
 if (n==-1){
     fprintf(append, "%s\n", arr2);
 }
 fclose(stream);
 fclose(append);
 system("pause");
}

答案 2 :(得分:1)

  1. 我不确定为什么要用+打开流,因为你实际上从未写过它。也许你想确保文件存在,即使0长度?你应该仍然检查打开是否成功。

  2. 然后您将100个字符读入一个只有5个字节的数组中,这样如果文件确实包含该数字,您将获得严重的内存覆盖。

  3. scanf当然也不安全,因为用户可能输入太多字符(实际上它们限制为4,因为有一个NULL终结符被读取)。

  4. 如果用户没有从文件中输入匹配的行,则最后您似乎是随机写入最后一行。