关于C语言输入输出的逗号问题(小细节)

C语言的输入输出必须要遵循scanf和printf的格式,就是你是什么格式你就要输入什么。

 

一、输入问题

#include <stdio.h>
int main()
{  	int a,b;
    scanf("%d,%d",&a,&b);
	printf("a+b=%d",a+b);
    return 0;
}

 这个程序我们可以看到它运行的结果是错误的!为什么呢,因为我们在scanf中已经指定了输入格式,输入格式是两个数中间用逗号隔开,所以我们输入时也必须在输入的两个数之间加逗号隔开,我们再次输入试一下

这样就对了!哪假如把逗号改成别的字符,还需要输入别的字符吗?

#include <stdio.h>
int main()
{  	int a,b;
    scanf("%d+%d",&a,&b);
	printf("a+b=%d",a+b);
    return 0;
}

 我们把","改成了"+",我们再试试直接用空格隔开两个数,看看结果对吗?

 答案是错的,那我们在输入的两个数之间加入逗号呢?

答案还是错的,最后我们试着也在输入的时候在两个数之间加入"+"。

哇哦!答案终于对了!所以我们可以得出一个结论就是scanf中的输入格式是什么样的,我们输入时也就必须和其中格式完全一致,否则就会出现读取错误。 

我们平时的输入一般以空格隔开,一般不会以逗号隔开,所以我们将程序改成我们日常习惯的输入然后再试试结果。

#include <stdio.h>
int main()
{  	int a,b;
    scanf("%d %d",&a,&b);
	printf("a+b=%d",a+b);
    return 0;
}

我们将程序改成这样,我们再输入试试。

没问题了!那我们要是把scanf中的空格去掉呢?

#include <stdio.h>
int main()
{  	int a,b;
    scanf("%d%d",&a,&b);
	printf("a+b=%d",a+b);
    return 0;
}

我们把程序改成这样,按理是不是我们输入的时候不用空格直接连着输入两个数呢?不!如果你输入三位数,这样程序怎么知道你是把前两位赋值给了a,还是把前1位赋值给了a呢?这样会造成歧义,所以如果scanf中两个%d之间什么也不加就是默认空格隔开了,我们再试一下程序看看!

好的!没有问题!这样我们就搞清了输入格式。 

 二、输出问题

先看这样一个程序,猜猜它的输出是什么。

#include <stdio.h>
int main()
{  	int a,b,c;
    scanf("%d%d%d",&a,&b,&c);
	printf("a=%d,b=%d,c=%d",a,b,c);
    return 0;
}

你猜对了吗?

有了上面输入问题的铺垫相信大家都可以很快明白为什么是这样输出了。 

那我们再试着去掉逗号看看,把程序改成这样。

#include <stdio.h>
int main()
{  	int a,b,c;
    scanf("%d%d%d",&a,&b,&c);
	printf("a=%db=%dc=%d",a,b,c);
    return 0;
}

输出自然也是紧挨的。

那我们如果在之间加上空格呢?把程序修改成下面这样。

#include <stdio.h>
int main()
{  	int a,b,c;
    scanf("%d%d%d",&a,&b,&c);
	printf("a=%d b=%d c=%d",a,b,c);
    return 0;
}

看看输出

哇哦!输出之间也有了空格,所以我们可以得出结论:输入scanf下的%d之间,因为输入歧义性问题有空格和无空格实际上是一样的,而输出的printf下的%d之间,如果有空格就输出空格,如果没有就不输出。 

总结

总之,无论输入与输出,都遵循着一定的格式,我们必须严格按照我们自己所规定的格式进行输入输出,否则就会造成不小的麻烦。细节决定成败,态度决定高度。让我们一起加油!

这个问题的解答需要更多的信息和细节,因为销售统计报表的内容和格式可能因公司或行业而异。此外,时间段的选择也需要明确,例如按月、季度或年份统计销售数据。 一般来说,编写输出销售统计报表的程序,需要以下步骤: 1. 读取销售数据文件或数据库中的销售记录。 2. 根据时间段对销售数据进行筛选和过滤,只保留指定时间段内的销售记录。 3. 对销售记录进行统计,例如按商品分类、销售渠道、地区等统计销售额、销售量、平均售价等指标。 4. 将统计结果按照报表格式输出,可以是纯文本格式、表格形式或图表形式。 下面是一个简单的示例程序,它假设销售数据已经存储在一个文本文件中,每行包含销售日期、商品名称和销售金额,以逗号分隔。程序会提示用户输入起止日期,然后输出指定时间段内的销售统计报表,按照商品名称和销售金额排序。 ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_LINE_LEN 100 #define MAX_ITEMS 1000 struct SaleRecord { char date[11]; char item[21]; double amount; }; int compare_sales(const void* p1, const void* p2) { struct SaleRecord* s1 = (struct SaleRecord*)p1; struct SaleRecord* s2 = (struct SaleRecord*)p2; int cmp = strcmp(s1->item, s2->item); if (cmp != 0) { return cmp; } else { return s2->amount - s1->amount; // 按销售金额倒序排列 } } int main() { char filename[21]; char start_date[11], end_date[11]; struct SaleRecord sales[MAX_ITEMS]; int num_sales = 0; double total_sales = 0.0; printf("Enter sales data file name: "); scanf("%s", filename); printf("Enter start date (YYYY-MM-DD): "); scanf("%s", start_date); printf("Enter end date (YYYY-MM-DD): "); scanf("%s", end_date); FILE* fp = fopen(filename, "r"); if (fp == NULL) { printf("Error: cannot open file %s\n", filename); return 1; } char line[MAX_LINE_LEN]; while (fgets(line, MAX_LINE_LEN, fp) != NULL) { char* date = strtok(line, ","); char* item = strtok(NULL, ","); char* amount_str = strtok(NULL, ","); double amount = atof(amount_str); if (strcmp(date, start_date) >= 0 && strcmp(date, end_date) <= 0) { struct SaleRecord s; strncpy(s.date, date, 11); strncpy(s.item, item, 21); s.amount = amount; sales[num_sales++] = s; total_sales += amount; } } fclose(fp); if (num_sales == 0) { printf("No sales data found in the specified period.\n"); return 0; } qsort(sales, num_sales, sizeof(struct SaleRecord), compare_sales); printf("Sales report from %s to %s:\n", start_date, end_date); printf("Total sales: $%.2f\n", total_sales); printf("Item\t\tAmount\n"); printf("----\t\t------\n"); for (int i = 0; i < num_sales; i++) { printf("%-20s $%.2f\n", sales[i].item, sales[i].amount); } return 0; } ``` 这个程序使用了结构体来存储销售记录,使用了快速排序算法来按照商品名称和销售金额排序。输出结果类似于下面的格式: ``` Sales report from 2021-01-01 to 2021-03-31: Total sales: $123456.78 Item Amount ---- ------ Apple $1234.56 Banana $987.65 Cherry $654.32 ... ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马看到什么是人决定的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值