为什么我的转换说明符在 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);
我是 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);