C程序不打印结构中的字符串

C Program not printing the string in a structure

我制作了一个程序,将多个输入作为字符串,存储并打印它们。 不知何故,存储在 a[i].acn 中的“帐号”未打印。我试过调试,问题似乎出在向 a[i].name 添加空格的循环中。

#include <stdio.h>
#include <string.h>
struct Bank
{
    char name[10],acn[8];
    float bal;
}a[100];
int n,i,flag;
void add()
{
//function to add Rs. 100 to accounts that have balance over 1000
//and print the details.
    for(i=0;i<n;i++)
        if(a[i].bal>=1000)
            a[i].bal+=100;
    printf("\nS.No.\tName\t\tAcc. No.\tBalance(in Rs.)");
    for(i=0;i<n;i++)
        printf("\n[%d]\t%s\t%s\t%.2f",i+1,a[i].name,a[i].acn,a[i].bal);
}
void main()
{
    printf("Enter the number of customers: ");
    scanf("%d",&n);
    printf("Enter the details of %d customers:\n",n);
    for(i=0;i<n;i++)
    {
        printf("\nCustomer-%d",i+1);
        printf("\nFirst Name: ");
        fflush(stdin);
        gets(a[i].name);
        printf("Account Number: ");
        fflush(stdin);
        gets(a[i].acn);
        printf("Account Balance: ");
        scanf("%f",&a[i].bal);
    }
    for(i=0;i<n;i++)//The problem seems to be in this loop
        while(strlen(a[i].name)<10)
            strcat(a[i].name," ");
    add();
}

输入:

Enter the number of customers: 2
Enter the details of 2 customers:

Customer-1
First Name: Aarav
Account Number: ASDF1234
Account Balance: 1200

Customer-2
First Name: Asd
Account Number: abcd1122
Account Balance: 999.9

输出:

S.No.   Name            Acc. No.        Balance(in Rs.)
[1]     Aarav                   1300.00
[2]     Asd                     999.90

您的程序中需要更正的地方很少。

  1. 使用fgets而不是gets,因为在gets中没有边界检查并且存在读取超出分配大小的危险。

  2. 当使用 fgetsscanf 甚至 gets 时,它们都从标准缓冲区中读取剩余的 \n 个字符,因此使用 fgets 如果我们正确使用它,我们可以避免它。(scanf 也可以避免 space 个字符,但它不能用于读取多词字符串)

  3. 删除fflush(stdin),它不是必需的你可以看到原因here

  4. 最后但同样重要的是使用 int main() 而不是 void main()

你有这个:

struct Bank
{
    char name[10],acn[8];
    float bal;
}a[100];

因为 C 字符串必须以 NUL 字符结尾(又名 '[=12=]'),name 最多可以包含 9 个字符。

但是这里

    while(strlen(a[i].name)<10)
        strcat(a[i].name," ");

您不断添加空格,直到它的长度达到 10 个字符。换句话说 - 你写在数组之外。

name改为name[11]

除此之外getsfflush(stdin)应该避免。

scanf() 那么 gets() 就不好了

scanf("%d",&n); 读取整数,但在 stdin 中留下以下 '\n'gets() 读取为空 string "".

我建议使用 fgets() 将所有行读入一个相当大的缓冲区,然后使用 sscanf()strtol() 等进行解析


代码溢出缓冲区

a[i].nam 的空间只够 9 个字符,然后是 空字符 。追加一个 space 直到它的长度超过 9 个溢出 .name[10].

struct Bank {
  char name[10],acn[8];
  float bal;
} a[100];

while(strlen(a[i].name)<10)
   strcat(a[i].name," ");

while(strlen(a[i].name)<9)填充space,但不要太多。


钱需要特别的considerations。现在,考虑一个 long 的最低面额(美分)。读入 double 然后 long balance = lround(input*100.0);

存在其他弱点。