提问人:Neziki 提问时间:11/8/2023 最后编辑:jpsNeziki 更新时间:11/9/2023 访问量:129
这段代码有什么问题?我是 C 语言的新手 [已关闭]
What's wrong with this code? I'm new in C [closed]
问:
编译器给出了关于未初始化的 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;
}
我试图更改元素,但它不起作用
答:
0赞
Lajos Arpad
11/9/2023
#1
此代码将无法正常工作:
for(int i=0;i<numBooks;i++){
//...
}
i++;
因为 的范围是循环的块。为了能够在循环后重用,您可以在 :i
for
i
for
for
int i;
for(i=0;i<numBooks;i++){
//...
}
i++;
但是,即使认为这在语法上是正确的,你也可能会问自己:我真的需要这个吗?毕竟,在周期结束时,很明显最终会与 相等。for
i
numBooks
1赞
Debuholden
11/9/2023
#2
要了解您的问题,您首先需要了解范围。
在 C 语言中,有 2 种类型的作用域:全局作用域和局部作用域。全局范围内的变量在定义变量后,可以在程序中的任何位置访问。局部作用域中的变量稍微复杂一些。当您在函数中创建变量时,在定义该变量之后,该函数内的任何位置都可以访问该变量。另请注意,还有其他几种情况可能适用本地范围,我不会在这里赘述。
在您的例子中,您在循环中创建了一个变量,该变量无法访问该循环的大小。这意味着您必须在函数作用域内创建变量,而不是在循环作用域内创建变量。只需执行您之前所做的操作,将定义变量放在循环之外,就像使用 & 一样。即n
l
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);
}
评论
for (int k = 0; k < 100; k++) { /*stuff*/ }
k
gets()
scanf
scanf
fgets()
sscanf()
"%s"
gets
"%s"
"%99s"