#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;
}
当我编译第 36 行时,我收到警告:
D:\Works\ABKC1406\Hasil_Tes_Formatif\main.c|36|warning: format '%s' expects argument of type 'char *', but argument 3 has type 'int' [-Wformat]|
最佳答案
在 C 中,“字符串”只不过是 char
的数组。 。它已终止(有关详细信息,请参阅下面的“注意”)。
您的代码恰好定义了一个这样的数组:
char nama[ SIZE ];
所以代码定义了一个“字符串”。
您显然需要一个字符串数组,因此您需要做两件事:
- 定义任何字符串的最大长度。
- 您想要的字符串数量。
后者将是 SIZE
,前者我们可以定义为
#define NAMALEN_MAX (100)
保存用户输入的所有名称的“字符串”数组的定义如下所示:
char nama[SIZE][NAMALEN_MAX];
扫描名称的语句将如下所示:
scanf("%s", nama[i]);
这些是纠正代码的基本更改。
<小时/>代码仍然没有保存。
同时应用以下两项更改:
要扫描的内容不超过目标数组可以容纳的内容,请更改此设置
scanf("%s", nama[i]);
成为
scanf("%99s", nama[i]);
此更改告诉程序不要扫描超过 99 个
char
来自用户的。为什么
99
而不是100
?注意 C-“字符串”需要一个额外的
char
通过放置'\0'
来标记字符串结尾值(又名NUL
),即所谓的0
-终止符,或空终止符(不要与NULL
混淆,它是空指针常量,与“字符串”无关。)。您的
for
-循环循环n
次。数组的容量不超过SIZE
值(value)观。代码需要确保循环不会再循环
SIZE
次。为了确保这一点,请在
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; }
关于定义“字符串”数组的一句话:
而不是这样做:
char nama[SIZE][NAMALEN_MAX];
一个可以做:
typedef char[NAMALEN_MAX] Nama_Element;
Nama_Element nama[SIZE];
这将隐藏 nama
的事实仍然是 char
的二维数组.
但是不要这样做,因为它不必要地混淆您的代码。
关于c - 将 %s 与数组一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37479203/