为什么我的转换说明符在 C 中不能正常工作

Why my conversion specifiers doesn't work properly in C

我是 C 的新手,处理文本格式设置对我来说有点挑战。 我尝试输入首字母 J。 S.(字符之间的空格)和名称 John Smith 以及我的 initials 数组存储值 J。 S.John Smith 这不是应该的。

谁能解释一下为什么会这样。

这是我的代码片段(只是示例)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

struct Person
{
    char initials[5];
    char name[35];
};

int main(void)
{
    struct Person person;
    printf("Please enter symbols: ");
    scanf("%6[^\n]%*c", person.initials);
    printf("%s\n", person.initials);
    printf("Please enter your name: ");
    scanf("%35[^\n]%*c", person.name);
    printf("%s\n", person.name);
    printf("%s\n", person.initials);
}

输出:

Please enter symbols: J. S.
J. S.
Please enter your name: John Smith
John Smith
J. S.John Smith

非常感谢您的帮助。

您的 initials 数组不够大,无法存储您输入的内容。

字符串“J. S.”由 5 个字符加上一个终止空字节组成,总共 6 个字节。 initials 只有 5 个字节宽,因此您超出了缓冲区。

此外,您为 scanf 格式使用的尺寸不正确。它们应该比数组的大小小一,以便在读取字符串时考虑终止空字节。

initials 更改为足够大以容纳所需的字符串:

char initials[6];

并更改格式以正确说明它们可以容纳的最大字符串。

scanf("%5[^\n]%*c", person.initials);
scanf("%34[^\n]%*c", person.name);