1

我是C 语言的新手,处理对我来说有点挑战性的文本格式。我尝试输入缩写JS(字符之间的空格)并命名John Smith,我的缩写数组存储不应该的值JSJohn 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

将非常感谢您的帮助。

4

1 回答 1

3

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

字符串“JS”由 5 个字符加上一个终止的空字节组成,总共 6 个字节。 initials只有 5 个字节宽,所以你溢出了缓冲区。

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

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

char initials[6];

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

scanf("%5[^\n]%*c", person.initials);
scanf("%34[^\n]%*c", person.name);
于 2021-07-05T22:13:42.653 回答