=IIf([W3] Is Null;"-";IIf([W3]>[L3];"1";"0"))
当我编译第36行时,我收到了警告:
#include <stdio.h>
#include <stdlib.h>
#define SIZE 30
int main()
{
int n; // jumlah data siswa
int NIS[ SIZE ];
char nama[ SIZE ];
int nilai[ SIZE ];
size_t i;
int minimum;
int maximum;
int total = 0;
float mean;
unsigned int pass;
unsigned int hold;
printf( "Masukkan banyak data (tidak lebih dari 30) = " );
scanf( "%d", &n );
for ( i = 0; i < n; i++ ){
printf( "NIS: " );
scanf( "%d", &NIS[ i ]);
printf("Nama: ");
scanf( "%s", &nama[ i ]);
printf( "Nilai: ");
scanf( "%d", &nilai[ i ]);
total += nilai[ i ];
puts( "" );
}
system("cls");
printf("NIS.\t Nama Siswa\t Nilai\n");
printf("=================================\n");
for(i=0;i<n;i++){
printf("%d\t %s\t\t %d\n", NIS[ i ], nama[ i ], nilai[ i ]);
printf("=================================\n");
}
return 0;
}
答案 0 :(得分:3)
在C a&#34;字符串&#34;除了一组char
之外别无其他。它已终止(详见下文&#34; 注意&#34;详细信息)。
您的代码只定义了一个这样的数组:
char nama[ SIZE ];
因此代码定义了一个&#34;字符串&#34;。
你显然想要一个字符串数组,所以你需要做两件事:
后者将是SIZE
,前者我们可以定义为
#define NAMALEN_MAX (100)
&#34;字符串&#34;的数组的定义包含用户输入的所有名称,然后是new:
char nama[SIZE][NAMALEN_MAX];
扫描名称的语句将如下所示:
scanf("%s", nama[i]);
这些是纠正代码的重要变化。
代码仍然没有保存。
同样适用以下两项更改:
要扫描的目标数组不能超过目标数组,请更改此
scanf("%s", nama[i]);
是
scanf("%99s", nama[i]);
此更改告诉程序不要扫描用户超过99 char
秒。
为什么是99
而不是100
?
注意 C - &#34;字符串&#34; s需要一个额外的char
来标记字符串结尾处的放置一个'\0'
值(又名NUL
),即所谓的0
- 终止符或null终止符(不要与NULL
混淆,这是null -pointer常量与&#34;字符串&#34; s无关。
您的for
- 循环循环n
次。数组的值不超过SIZE
。
代码需要确保循环不会循环SIZE
次。
为了确保这个添加一些所谓的&#34;输入验证&#34;以n
为例:
scanf("%d", &n);
if (SIZE < n)
{
printf("Maximum number (%s) of allowed input records exceeded (%d).\n", SIZE, n);
printf("Using %d instead of %d.\n", SIZE, n);
n = SIZE;
}
关于定义&#34;字符串&#34; s:
的数组的一个词而不是:
char nama[SIZE][NAMALEN_MAX];
一个可以做:
typedef char[NAMALEN_MAX] Nama_Element;
Nama_Element nama[SIZE];
这会隐藏nama
仍然是 char
的2D数组的事实。
但不执行此操作,因为它不必要地模糊您的代码。
答案 1 :(得分:0)
你的printf调用的问题是%s
期望char *
,你给char
。
名为nama
的变量是char
的数组,因此nama[i]
的类型为char
,而不是char *
。并且编译器必须将其自动转换为int
。我想你想用:
printf("%d\t %s\t\t %d\n", NIS[i], nama, nilai[i]);
这与您的scanf调用存在同样的问题:
scanf("%s", nama);