将%s与数组一起使用

时间:2016-05-27 09:00:01

标签: c

=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;
    }

2 个答案:

答案 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]);

这些是纠正代码的重要变化。

代码仍然没有保存。

同样适用以下两项更改:

  1. 要扫描的目标数组不能超过目标数组,请更改此

    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无关。

  2. 您的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;
    }
    
  3. 关于定义&#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);