c - 将 %s 与数组一起使用

标签 c

    #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]);

这些是纠正代码的基本更改。

<小时/>

代码仍然没有保存。

同时应用以下两项更改:

  1. 要扫描的内容不超过目标数组可以容纳的内容,请更改此设置

    scanf("%s", nama[i]);
    

    成为

    scanf("%99s", nama[i]);
    

    此更改告诉程序不要扫描超过 99 个 char来自用户的。

    为什么 99而不是 100

    注意 C-“字符串”需要一个额外的 char通过放置 '\0' 来标记字符串结尾值(又名 NUL ),即所谓的 0 -终止符,或空终止符(不要与 NULL 混淆,它是空指针常量,与“字符串”无关。)。

  2. 您的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/

相关文章:

C: 程序退出时做某事

c - C语言无效转换错误

c - 如何链接多个管道? (加上奇怪的 bug )

c - 从 C 文本文件中读取逗号分隔的数字(坐标)

c - fread 返回值 1 字节,即使文件正在被完全读取

python - 在 Python 中为 C 库创建包装器

c - 如何从给定索引strcat和strcpy一个字符串?

c - 如何用C中的函数打印二维数组?

c - 如何从文件中获取字符到动态数组

c - 如何修复代码以打开代码块中命令提示符中传递的文件