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
您的程序中需要更正的地方很少。
使用fgets
而不是gets
,因为在gets
中没有边界检查并且存在读取超出分配大小的危险。
当使用 fgets
、 scanf
甚至 gets
时,它们都从标准缓冲区中读取剩余的 \n
个字符,因此使用 fgets
如果我们正确使用它,我们可以避免它。(scanf
也可以避免 space 个字符,但它不能用于读取多词字符串)
删除fflush(stdin)
,它不是必需的你可以看到原因here
最后但同样重要的是使用 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]
除此之外gets
和fflush(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);
存在其他弱点。
我制作了一个程序,将多个输入作为字符串,存储并打印它们。
不知何故,存储在 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
您的程序中需要更正的地方很少。
使用
fgets
而不是gets
,因为在gets
中没有边界检查并且存在读取超出分配大小的危险。当使用
fgets
、scanf
甚至gets
时,它们都从标准缓冲区中读取剩余的\n
个字符,因此使用fgets
如果我们正确使用它,我们可以避免它。(scanf
也可以避免 space 个字符,但它不能用于读取多词字符串)删除
fflush(stdin)
,它不是必需的你可以看到原因here最后但同样重要的是使用
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]
除此之外gets
和fflush(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);
存在其他弱点。