在仍然提问的同时存储用户输入

时间:2018-04-04 09:47:25

标签: c

首先,我知道下面的源代码很长,你真的不应该发布这样的代码,但我真的不明白为什么它不起作用或如何解释我的问题而不是像这样发布它。

我试图将答案存储在其中的每个问题中,并在脚本的末尾显示它们。我遇到的最大问题是我得到了错误 "subscripted value is neither array nor pointer nor vector scanf("%s", a[i].incdest);"

该程序不接受[i] .incdest。它为所有数组值执行此操作。

它也说在函数主变量“comp1”是未声明的。

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

int c_s(char*, char*);

typedef struct
{
    char constab[30];
    char vicwit[15];
    char witdet[200];
    char incdest[300];
    char comp1[15];
    char comp2[200];;
} sheetstore;

#define ARRAYLEN 2

sheetstore a[ARRAYLEN];
FILE *fp;

int main()
{
    int i, a;
    char wit[10] = "witness";
    char yes[10] = "yes";
    char comp1[10];

    fp = fopen("sheetstore.dat","a+");

    printf("Hate crime reporting system\n\n\n");

    printf("If the crime you are reporting is an emergency,\nplease call 999, do not proceed any further with this form\n\n\n\nPlease press enter to confirm you have read the above and continue\n");
    char enter = 0;
    while (enter != '\r' && enter != '\n') { enter = getchar(); }

    for( i=0; i<ARRAYLEN ; i++)
    {
        printf("Which police constabulary did the offence take place in?\n\n");
        scanf("%s", a[i].constab);
        printf("Are you a victim or witness of the crime?\nPlease answer victim/witness\n\n");
        scanf("%s", a[i].comp1);
        int res1 = (strcmp (comp1, wit));
        if(res1 == 0){
            printf("Please enter the details including phone number and address of any other witnesses that were present\n");
        }
        scanf("%s", a[i].witdet);
        else{
            printf("Where did the incident take place?\nIf in a house please provide the full address including postcode\n");
            scanf("%s", a[i].incdest);
        }

        fwrite(&a[i], sizeof(a), 1, fp);
    }
    fclose(fp);

    fopen("sheetstore.dat", "r");
    for(i=0; i<ARRAYLEN; i++)
    {
        fread(&a[i], sizeof(a), 1, fp );
        printf("Which police constabulary did the offence take place in? : %s\n", a[i].constab);
        printf("Are you a victim or witness of the crime? : %s\n", a[i].comp1);
        printf("Please enter the details including phone number and address of any other witnesses that were present : %s\n", a[i].witdet);
        printf("Where did the incident take place? : %s\n", a[i].incdest);
    }
    fclose(fp);

    return 0;
}

3 个答案:

答案 0 :(得分:1)

我在您的代码中看到的主要问题是,您通过在a中声明一个名称相同的sheetstore a[ARRAYLEN];来隐藏数组intmain()) 。

你还有一个scanf错位。

我修复了你的代码并为每一个更改添加了注释 - 现在,我不会继续检查你的代码的功能,但至少这将编译并希望能让你更好地理解你错在哪里 - 来自这取决于你:

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

int c_s(char*, char*);

typedef struct
{
    char constab[30];
    char vicwit[15];
    char witdet[200];
    char incdest[300];
    char comp1[15];
    char comp2[200];;
} sheetstore;

#define ARRAYLEN 2

sheetstore sheetArr[ARRAYLEN]; //change this 'a' to avoid shadowing by the decleration on 'int a' in main
FILE *fp;

int main()
{
    int i, a;
    char wit[10] = "witness";
    char yes[10] = "yes";
    char comp1[10];

    fp = fopen("sheetstore.dat","a+");

    printf("Hate crime reporting system\n\n\n");

    printf("If the crime you are reporting is an emergency,\nplease call 999, do not proceed any further with this form\n\n\n\nPlease press enter to confirm you have read the above and continue\n");
    char enter = 0;
    while (enter != '\r' && enter != '\n') { enter = getchar(); }

    for( i=0; i<ARRAYLEN ; i++)
    {
        printf("Which police constabulary did the offence take place in?\n\n");
        scanf("%s", sheetArr[i].constab);//change name from 'a'
        printf("Are you a victim or witness of the crime?\nPlease answer victim/witness\n\n");
        scanf("%s", sheetArr[i].comp1);//change name from 'a'
        int res1 = (strcmp (sheetArr[i].comp1, wit));//compare with the value set in the struct
        if(res1 == 0){
            printf("Please enter the details including phone number and address of any other witnesses that were present\n");
            /*this scanf should be inside the brackets of 'if(res1 == 0)' */
            scanf("%s", sheetArr[i].witdet);//change name from 'a'
        }
        else{
            printf("Where did the incident take place?\nIf in a house please provide the full address including postcode\n");
            scanf("%s", sheetArr[i].incdest);//change name from 'a'
        }

        fwrite(&sheetArr[i], sizeof(sheetstore), 1, fp);//write a single struct
    }
    fclose(fp);

    fopen("sheetstore.dat", "r");
    for(i=0; i<ARRAYLEN; i++)
    {
        fread(&sheetArr[i], sizeof(sheetstore), 1, fp );//read a single struct
        printf("Which police constabulary did the offence take place in? : %s\n", sheetArr[i].constab);
        printf("Are you a victim or witness of the crime? : %s\n", sheetArr[i].comp1);
        printf("Please enter the details including phone number and address of any other witnesses that were present : %s\n", sheetArr[i].witdet);
        printf("Where did the incident take place? : %s\n", sheetArr[i].incdest);
    }
    fclose(fp);

    return 0;
}

答案 1 :(得分:0)

以下提议的代码:

  1. 更正代码的前50行。
  2. 请更正您发布的代码,以便干净利落地编译
  3. 为了灵活性,将struct的定义与struct
  4. 的typedef分开
  5. 从系统功能中正确检查错误指示
  6. 尊重合适的保证金(通常为72或80个字符)
  7. 在适当时调用printf(),将{C = 1}}的CPU周期密集型呼叫替换为
  8. 这只是OPs代码前50行的指南。它不是完整的代码替换。
  9. 现在建议的代码:

    puts()

答案 2 :(得分:0)

除了上面发布的一些有用的评论(有意义的变量名称,行宽不能太长以便于阅读),一般来说,你的问题是由两件事造成的:在主体的主体中函数声明 int a ,而不是全局数组 a [ARRAYLEN] 。因此,您无法拒绝 a [i] .incdet 等。只需在函数中注释或删除 int a 即可。其次,你的 scanf(&#34;%s&#34;,a [i] .witdet); 应该根据程序逻辑在上面的if语句的主体中。我做了这两个更改,代码将编译。但是,如果将 -Wall -Werror 传递给编译器,则会产生错误,如错误:未使用的变量'yes'[-Werror = unused-variable]      char yes [10] =&#34; yes&#34 ;; 。只需注释此行以避免在堆栈上使用不必要的内存空间。