#include <stdio.h>
pac()
{
int i,j,k,size;
char ns[size];
int nss[size];
printf("ENTER THE NUMBER OF STUDENTS: ");
scanf("%d",size);
for(i=0;i<size;i++)
{
printf("ENTER THE NAME OF STUDENT: ");
scanf("%c",ns[i]);
}
for(j=0;j<size;j++)
{
printf("ENTER THE MARKS OF THE STUDENT: ");
scanf("%d",nss[j]);
}
for(k=0;k<size;k++)
{
printf("%c",ns[i]);
}
}
main()
{
pac();
}
我知道错误太小但我是C的新手,所以请让我知道这个错误。 在第一次输入学生数量后,此代码中存在分段错误。
答案 0 :(得分:1)
更改
scanf("%d",size);
^You missed & operator here.
到
scanf("%d", &size);
现在,由于您使用的是VLA,因此需要在获得size
的值后放置VLA的声明。
printf("ENTER THE NUMBER OF STUDENTS: ");
scanf("%d", &size);
char ns[size];
int nss[size];
答案 1 :(得分:0)
size
未初始化,然后您使用它来设置数组大小,这是undefined behavior。正如弗雷德所说,稍后设置size
将不会重新调整数组的大小神奇地。
在初始化数组之前,你应该调用scanf
,但是你需要传入一个指针:
scanf("%d",&size);
^
你也依赖于main
和pac
的隐式int,你应该明确设置它们的返回类型int
main
可能{{1} } void
。
你应该看到大多数这些警告,甚至不必打开它们。 pac
和gcc
都会为隐式int 返回和clang
的错误使用提供警告,类似于:
警告:返回类型默认为'int'[默认启用]
警告:格式'%d'需要类型为'int *'的参数,但参数2的类型为'int'[-Wformat]
并出现警告也会让我发出警告:scanf
已初始化:
警告:'size'在此函数中未初始化使用[-Wuninitialized]
答案 2 :(得分:0)
#include <stdio.h>
pac()
{
int i,j,k,size;
printf("ENTER THE NUMBER OF STUDENTS: ");
scanf("%d",&size); // <-- need to pass in the address of size
do { // <-- you need this to establish the size for array creation
char ns[size];
int nss[size];
for(i=0;i<size;i++)
{
printf("ENTER THE NAME OF STUDENT: ");
scanf("%c",&(ns[i])); // <-- need the address here, too
}
for(j=0;j<size;j++)
{
printf("ENTER THE MARKS OF THE STUDENT: ");
scanf("%d",&(nss[j])); // <-- and again here
}
for(k=0;k<size;k++)
{
printf("%c",ns[i]);
}
} while(0);
}
main()
{
pac();
}
答案 3 :(得分:0)
这是所有答案的组合。
尺寸未初始化(已说明)
scanf的第二个参数必须是指针(&amp; size,&amp; ns [i],...)
根据大小值动态分配空间,或者使用ns和nss修复足够的大小(#define MAX_SIZE 1000并检查大小&lt; MAX_SIZE)。
你可以这样编码:
void pac()
{
int i;
int j;
int k;
int size;
char *ns;
int *nss;
printf("ENTER THE NUMBER OF STUDENTS: ");
scanf("%d",&size);
/* Check size */
if (size > 0)
{
ns = (char *)malloc(size * sizeof(char));
nss = (int *)malloc(size * sizeof(int));
/* check ns and nss are not NULL and then continue */
for(i = 0; i < size; i++)
{
printf("ENTER THE NAME OF STUDENT: ");
scanf("%c",&ns[i]);
}
for(j = 0; j < size; j++)
{
printf("ENTER THE MARKS OF THE STUDENT: ");
scanf("%d", &nss[j]);
}
for(k = 0;k < size; k++)
{
printf("%c", ns[i]);
}
}
}