【问题标题】:What is causing the error “expected ‘;’, ‘,’ or ‘)’ before ‘.’ token”?是什么导致错误“预期的';',','或')'在'.'标记之前”?
【发布时间】:2020-11-19 12:27:48
【问题描述】:

我目前正在为学生的分数制作一个索引器,但是,由于我是 C 新手,所以我不了解阅读错误。这是我遇到的错误:

  1. c:11:27: 错误:在“.”标记之前需要“;”、“,”或“)” 11 |双重平均(浮点输入.score,int input.many){
  2. c:34:13:警告:指针和整数之间的比较 34 | for(i=0; i many; i++){
  3. c:48:3:警告:函数“平均”的隐式声明 [-Wimplicit-function-declaration] 48 |平均(总和,nas->许多);
  4. while 循环无法正常工作

这是我正在处理的代码:

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

#define MAX 100

typedef struct{
    float score, avg, sum, *many;
    char name[100][100];
} input;    
    
double average(float input.score, int input.many){
    float sum=0, average, a;
    int i;
        
    for(i=0; i<input.many;i++){
        sum += input[i].score;
    }
    a = sum/input.many;
    average=a;
    
    return average;
}

int main(){
        
    input nas[MAX];
    
    float sum;
    int choose, i, aa;
    
    printf("How many students do you want to input?\n");
    scanf(" %d",&nas->many);
    
    for(i=0; i < nas->many; i++){
        input nas[i];
    
        printf("\nName of Student-%d\t\t: ",i+1);
        scanf(" %[^\n]s", nas[i].name);
        printf("The score of Student-%d\t\t: ",i+1);
        scanf(" %f", &nas[i].score);
    
        while(nas[i].score > 100 && nas[i].score < 0){
            printf("Invalid! Please re-input the score\t\t: ");
            scanf(" %f",&nas[i].score);
        }
        average(sum, nas->many);
    }
    
    printf("1--> Average of the scores");
    scanf("%d", &choose);   
    
    if(choose == 1){
        printf("The average of %d students is %f", nas->many, average());
    }
    ...
    else{ return 0;}

谁能帮我理解它?非常感谢

【问题讨论】:

  • 1.您不能在函数参数声明中使用.。 2. i&lt;input.many 正在比较 intfloat*。这看起来很奇怪。您可能必须使用变量来存储数组的长度。 3. average 的定义因为 1 无效。 4. 循环不会工作,因为你的代码不会编译。
  • @SZise 你好,我花了一点时间编辑你的代码并尝试理解它,你有很多错误,我已经做到了!您可以在下面查看
  • @MikeCAT 所以,对于数字 2,我需要声明另一个变量来存储数组?

标签: c pointers struct


【解决方案1】:

因为你不能在 C 标识符中使用 .。这是无效的。例如,您可以将其替换为 _

The only valid characters in a C identifier are letters, digits and underscore(忽略 Unicode)。

【讨论】:

  • 这是新的,似乎从未提及过。所以,非常感谢!
  • @SZise 我猜你的意思是新的为你?因为这条规则本身并不新鲜:它自 C 语言诞生以来就已经存在了将近 50 年。
  • 是的,这对我来说是新的,我什至不完全理解一两件事是如何工作的
【解决方案2】:

所以,结构上有一些变量没有任何意义,并且通过将参数发送到函数并调用函数会出现一些错误!你想要N个学生的平均值,所以你只能在插入分数后调用函数!

另一件事是为什么您需要将所有学生的分数总和保存为所有学生的平均数!而且您始终在 for 上声明该函数,因此当您在循环返回时为 1 个学生插入时,您会丢失数据,因为您再次声明它!

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


#define MAX 100

typedef struct{
    float score;
    char name[100];
} input;    
    
float average(input nas[], int many){
    float sum=0, a;
    int i;
        
    for(i=0; i< many;i++){
        sum += nas[i].score;
    }
    a = sum / many;
    
    return a;
}

int main(){
        
    input nas[MAX];
    
    float sum;
    int choose, i, many;
    
    printf("How many students do you want to input: ");
    scanf(" %d", &many);
    
    for(i=0; i < many; i++){
    
        printf("\nName of Student (%d): ",i+1);
        scanf("%[^\n]s", nas[i].name);
        printf("The score of Student (%d): ",i+1);
        scanf("%f", &nas[i].score);
    
        while(nas[i].score > 100 && nas[i].score < 0){
            printf("Invalid! Please re-input the score: ");
            scanf("%f", &nas[i].score);
        }
    }    

    sum = average(nas, many);
    
    printf("\n1--> Average of the scores: ");
    scanf("%d", &choose);   
    
    if(choose == 1){
        for(int j=0; j < many; j++){
            printf("\nName of Student: %s | Score: %f", nas[j].name, nas[j].score);

        }
        printf("\n\nThe average of %d students is %f\n", many, sum);
    }
    else{ 
        return 0;
    }
}

【讨论】:

  • 这是个愚蠢的问题,为什么 nas 来自 main 用于 float 函数,而不是直接来自结构?以及为什么 input.many 被缩减为 many,是不是也会从结构中失去它的价值?
  • @SZise 为什么你需要在你的结构上保存很多数量?就像学生 1 会有 nas.many 学生 2 会有 nas.many,为什么需要保存每个学生的学生数量?我不明白“为什么在浮点函数中使用 main 中的 nas,而不是直接来自结构?”的问题?
【解决方案3】:

关于:

scanf("%[^\n]s", nas[i].name);

您是否希望用户输入的字段 name 后跟一个“\n”,然后是 s

可能不会。

此外,此语句不会从 stdin 中删除“\n”。

因此,如果有的话,s 应该替换为空格(因此任何尾随的“空白”都会被消耗。但是,这“总是”是个坏主意。) 强烈建议使用:

scanf("%[^\n]", nas[i].name);  // note: no trailing `s`

请注意,使用 %f 说明符对 scanf() 的下一次调用将占用任何前导“空白”。

关于:

scanf(" %d",&nas->many);

这可能会导致数组nas[] 字段many 中的第一个元素被设置,但更好的方法是:

scanf(" %d",&nas[0]->many);

关于:在for() 声明之后:

input nas[i]; 

这是声明/重新声明一个新数组,其中包含i 变量指示的许多元素。可能不是你想做的。

关于:

char name[100][100];

这是声明一个包含 100 个条目的二维数组,每个条目为 100 个字符。然而,当发布的代码引用这个二维数组时,给出的只是name。结果将是所有名称将在第一个 [0] 条目中相互重叠

关于:

scanf("%[^\n]s", nas[i].name);

除了前面提到的格式字符串问题,以及在没有任何索引的情况下使用name,说明符:%[\n] 不会限制名称的长度。建议:

scanf("%99[^\n]", nas[i].name[i]);

除了上面提到的之外,发布的代码中还有很多其他问题。

【讨论】:

  • 好的,这是字符串的新内容。我写了 '&nas->many' 因为我认为这将为每个输入设置记忆,因此以后可以轻松访问以用于其他目的。 .name[i] 这是什么及其背后的逻辑?无论如何,谢谢你帮助我!
  • 关于:.name[i] 这是什么及其背后的逻辑? 字段name[][] 是一个 100 行的二维数组,每行 100 个字符,所以 @ 987654344@ 正在选择ith 行。结果是每个新的“名称”字符串都在不同的行中
猜你喜欢
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 2017-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-28
  • 2014-08-15
相关资源
最近更新 更多