这段代码有什么问题?我是 C 语言的新手 [已关闭]

What's wrong with this code? I'm new in C [closed]

提问人:Neziki 提问时间:11/8/2023 最后编辑:jpsNeziki 更新时间:11/9/2023 访问量:129

问:


这个问题是由错别字或无法再现的问题引起的。虽然类似的问题可能在这里是主题,但这个问题的解决方式不太可能帮助未来的读者。

13天前关闭。

编译器给出了关于未初始化的 i、j 和 k 的错误,虽然我以前使用过它们,但请告诉我出了什么问题,我刚刚开始学习 C,我卡在这里。

#include <stdio.h> 
#include <string.h> 
struct Book { 
    char title[100]; 
    int volume; 
    int year; 
    char author[100]; 
}; 
struct Magazine { 
    char title[100]; 
    int volume; 
    int month; 
    int year; 
    char editorialBoard[100]; 
}; 
struct Newspaper { 
    char title[100]; 
    int volume; 
    int day; 
    int month; 
    int year; 
    char editor[100]; 
}; 
struct Book books[10]; 
struct Magazine magazines[10]; 
struct Newspaper newspapers[10];  
int main(){ 
    int numBooks,numMagazine,numNewspapers,year; 
    printf("Enter the number of books: "); 
    scanf("%d",&numBooks); 
    printf("Enter number of journals: "); 
    scanf("%d",&numMagazine); 
    printf("Enter number of newspapers: "); 
    scanf("%d",&numNewspapers); 
    for(int i=0;i<numBooks;i++){  
        printf("Book %d\n",i+1); 
        printf("Title: "); 
        scanf("%s",&books[i].title); 
        printf("Volume: "); 
        scanf("%d",&books[i].volume); 
        printf("Year: "); 
        scanf("%d",&books[i].year); 
        printf("Author: "); 
        gets(books[i].author); 
    } 
    for(int j=0;j<numMagazine;j++){ 
        printf("Journal %d\n",j+1); 
        printf("Title: "); 
        scanf("%s",&magazines[j].title); 
        printf("Volume: "); 
        scanf("%d",&magazines[j].volume); 
        printf("Month: "); 
        printf("Year: "); 
        scanf("%d",&magazines[j].year); 
        scanf("%d",&magazines[j].month); 
        printf("Editors: "); 
        gets(magazines[j].editorialBoard); 
    } 
    for(int k=0;k<numNewspapers;k++){ 
        printf("Newspaper %d\n",k+1); 
        printf("Title: "); 
        scanf("%s",&newspapers[k].title); 
        printf("Volume: "); 
        scanf("%d",&newspapers[k].volume); 
        printf("Month: "); 
        printf("Year: "); 
        printf("Day: "); 
        scanf("%d",&newspapers[k].year); 
        scanf("%d",&newspapers[k].month); 
        scanf("%d",&newspapers[k].day); 
        printf("Editors: "); 
        gets(newspapers[k].editor); 
    }    
    printf("\nEnter the year: "); 
    scanf("%d",&year); 
    int n; 
    for(n=0;n<numBooks;++n){ 
        if(books[i].year == year) 
            printf("Book: %s, Author: %s\n",books[i].title,books[i].author); 
    }  
    int l; 
    for(l=0;l<numMagazine;++l){ 
        if(magazines[j].year == year) 
            printf("Magazine: %s, Editors: %s\n",magazines[j].title,books[j].editorialBoard); 
    }      
    for(int m = 0; m<numNewspapers ; m++){ 
        if(newspapers[k].year == year){ 
            printf("Newpaper: %s , Editor: %s \n",newspapers[k].title ,newspapers[k].editor); 
        }   
    }       
    return 0;  
}

我试图更改元素,但它不起作用

c 结构

评论

2赞 Jabberwocky 11/8/2023
第一件事是错误的:每一行之间都有一个空行。为什么?
1赞 Yevhen Kuzmovych 11/8/2023
@Jabberwocky我假设是因为 OP 最初没有将其格式化为代码,并且需要放置换行符,因此 SO 不会将所有代码合并到一行中。我已经编辑了帖子以格式化代码,但不打算删除多余的换行符。
5赞 pmg 11/8/2023
在循环之后,这样的变量不存在。它只存在于循环中。for (int k = 0; k < 100; k++) { /*stuff*/ }k
3赞 Weather Vane 11/9/2023
函数已过时,不再是标准 C 库的一部分。请阅读 为什么 gets 函数如此危险,以至于不应该使用它?这也可能导致您在将行读取函数与 混合使用时出现问题。使用 ,或使用 followed by 或其他字符串处理函数,但在您完全熟悉它们的怪癖之前不要混合它们。gets()scanfscanffgets()sscanf()
2赞 n. m. could be an AI 11/9/2023
@WeatherVane和它一样糟糕,但不知何故,我们倾向于让它溜走。请不要使用!如果需要读取字符串,请始终包含字段宽度,例如(99 而不是 100 以允许 null 终止符)。"%s"gets"%s""%99s"

答:

0赞 Lajos Arpad 11/9/2023 #1

此代码将无法正常工作:

for(int i=0;i<numBooks;i++){
    //...
}
i++;

因为 的范围是循环的块。为了能够在循环后重用,您可以在 :iforiforfor

int i;
for(i=0;i<numBooks;i++){
    //...
}
i++;

但是,即使认为这在语法上是正确的,你也可能会问自己:我真的需要这个吗?毕竟,在周期结束时,很明显最终会与 相等。forinumBooks

1赞 Debuholden 11/9/2023 #2

要了解您的问题,您首先需要了解范围

在 C 语言中,有 2 种类型的作用域:全局作用域和局部作用域。全局范围内的变量在定义变量后,可以在程序中的任何位置访问。局部作用域中的变量稍微复杂一些。当您在函数中创建变量时,在定义该变量之后,该函数内的任何位置都可以访问该变量。另请注意,还有其他几种情况可能适用本地范围,我不会在这里赘述。

在您的例子中,您在循环中创建了一个变量,该变量无法访问该循环的大小。这意味着您必须在函数作用域内创建变量,而不是在循环作用域内创建变量。只需执行您之前所做的操作,将定义变量放在循环之外,就像使用 & 一样。即nl

int i;
for(i=0;i<numBooks;i++){  
    printf("Book %d\n",i+1); 
    printf("Title: "); 
    scanf("%s",&books[i].title); 
    printf("Volume: "); 
    scanf("%d",&books[i].volume); 
    printf("Year: "); 
    scanf("%d",&books[i].year); 
    printf("Author: "); 
    gets(books[i].author); 
} 

TL;博士: 如上所述更改变量的作用域。另外,我为你做了