C编程语言

时间:2018-02-17 13:58:08

标签: c string c-strings null-terminated

由于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

请解释我这个。提前谢谢!

1 个答案:

答案 0 :(得分:1)

中,字符串不是固有类型。 C字符串是具有一维字符数组的约定,该字符数组由空字符'\0'终止。

使用这些知识应该是

 struct date{  char day[3];  char month[3];  char year[5];  

否则scanf 1 将无法将\0 存储在 数组中,它会如果您尝试通过使用2格式说明符获取daymonth4数字年份来获取%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位数年份。