繁体   English   中英

我使用printf函数有什么问题吗?

[英]Is there any problem with my usage of printf function?

我被赋予以下任务以在C中执行:-

一年分为四个季节:春季,夏季,秋季和冬季。 尽管由于日历的构建方式,每年的确切日期会有所不同,但在本练习中,我们将使用以下日期:

季节第一天
3月20日夏季
6月21日春季
9月22日秋季
12月21日冬季

创建一个程序,从用户读取一个月和一天。 用户将以字符串形式输入月份名称,然后以整数形式输入月份中的日期。

然后,程序应显示与输入日期关联的季节。

注意:例如,输入月份的前三个字母:1月代表1月,2月代表2月,等等。。。。。。。。。。。。。。。。。

我编写了一个迷你测试代码来检查第一个条件,即3月20日。

这是我的代码:-

#include <stdio.h>
#include <string.h>

int main(int argc, const char * argv[]) {
int date;
char month[3];

printf("Enter the month\n");
scanf("%s",month);

printf("Enter the date\n");
scanf("%d",&date);

int temp;
temp= strcmp(month,"Mar");
printf("output is %d\n",temp);
return 0;
}

我得到的问题是当输入为Mar20时 ,我得到输出:- “ output is 20” 而我想在我的测试代码中将输出设为0。

另一个观察结果是,如果我将日期更改为任何随机数,则将其作为输出,而我假设将得到存储在Temp中的值,即0。

如果我从代码中完全删除可变日期,我将获得正确的输出。 那时我得到0。

您使用的printf函数是正确的,您使用正确的转换说明符'%d'来打印整数,如https://linux.die.net/man/3/printf所述

变量“ month”可能不是很好 这是一个3字节的char缓冲区,用于存储。 您正在使用它来存储以null终止的字符串,因此它只能存储2个ASCII字符+ null终止符。

另一个问题是scanf函数如何用于获取月份字符串。 如果未指定字段宽度,则情况可能会变得很丑陋,有关更多信息,请参见https://linux.die.net/man/3/scanf

请记住,C字符串包含一个0值的终止符,因此要存储N个字符的字符串,您需要一个至少N + 1个元素宽的字符数组。

strcmp这样的字符串管理功能都依赖于该终止符来告诉他们字符串的结尾在哪里。 您得到怪异输出的可能原因是字符串常量"Mar"以0结尾,而存储在month数组中的字符串却不是,所以strcmp读到month数组的末尾直到看到0-值字节,并返回"Mar""Mar x "之间的差,其中x表示一些未知的字节序列。

访问数组末尾的内存将导致未定义的行为 ,并且任何结果都是可能的。

要解决此特定问题,请将month声明为4个元素的char数组,并在scanf调用中将输入限制为3个字符:

char month[4];
...
scanf( "%3s", month );

main的标准签名是

int main( void )

要么

int main( int argc, char *argv[] ); // NOT const

argv数组应该是可修改的:

5.1.2.2.1程序启动
...
—参数argcargv以及argv数组指向的字符串应可由程序修改,并在程序启动和程序终止之间保留其最后存储的值。

C 2011在线草案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM