由于null字符,是否发生以下问题。 '是/否&#39 ;.请解释原因。
第一个代码
#include<stdio.h>
struct date{ char day[2]; char month[2]; char year[4];
}current_date;
void main(){
printf("Enter day: ");
scanf("%s",current_date.day);
printf("Enter month: ");
scanf("%s",current_date.month);
printf("Enter year: ");
scanf("%s",current_date.year);
printf("\nEntered date is:
%s/%s/%s",current_date.day,current_date.month,current_date.year)
}
输入:
如果我每次扫描分别输入 17,02,1998
的输出:
Entered date is: 17021998/021998/1998
当我只改变结构中的数组长度时,第二个代码用于相同的输入。
#include<stdio.h>
struct date{ char day[3]; char month[3]; char year[5];
}current_date;
休息整个代码是一样的。
输出
Entered date is: 17/02/1998
请解释我这个。提前谢谢!
答案 0 :(得分:1)
在c中,字符串不是固有类型。 C字符串是具有一维字符数组的约定,该字符数组由空字符'\0'
终止。
使用这些知识应该是
struct date{ char day[3]; char month[3]; char year[5];
否则scanf
1 将无法将\0
存储在 数组中,它会如果您尝试通过使用2
格式说明符获取day
或month
或4
数字年份来获取%s
数字输入,则为未定义的行为 - 因为scanf
会尝试将其写入数组之外,那将是Undefined Behaviour。
scanf
用法为
if(scanf("%2s",current_date.day)!=1){
fprintf(stderr,"Error in input\n");
exit(EXIT_FAILURE);
}
您定义结构的方式 - 如果您还存储相应的1
,则会为您提供1
个月,3
数字日和\0
个数字年。那不是你想要的。在C
字符串中使用nul终止的char
数组实现 - scanf
存储它们。这就是为什么在我的情况下我使用了%2s
- 以便剩下的空间用于存储\0
。
1 这里注意%s
格式说明符下reference的一件事
匹配一系列非空白字符(一个字符串) 如果使用宽度说明符,则匹配宽度或直到第一个空白字符,以先出现的为准。 除匹配的字符外,始终存储空字符(因此参数数组必须至少有
width+1
个字符的空间。)
注意:正如Simon Berthiaume在评论中指出的那样 -
您可以像这样编写字符串长度:
char year[4+1];
,这样就可以清楚地了解内容大小。例如,在这种情况下,您需要4位数年份。