Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scanf函数未等待字符串输入_C_String_Scanf - Fatal编程技术网

Scanf函数未等待字符串输入

Scanf函数未等待字符串输入,c,string,scanf,C,String,Scanf,在此代码中,在为前两个scanf函数提供输入之后。输出将自动显示。我学习了字符串的这种形式的scanf。但它并不是专门等待它。有什么建议吗 #include <stdio.h> int main() { int p; int q; char kog[50]; scanf("%d",&p); scanf("%d",&q); scanf("%50[^ ]s",kog); printf("%d %d %s",p,

在此代码中,在为前两个scanf函数提供输入之后。输出将自动显示。我学习了字符串的这种形式的scanf。但它并不是专门等待它。有什么建议吗

#include <stdio.h>

int main()
{
    int p;
    int q;
    char kog[50];

    scanf("%d",&p);
    scanf("%d",&q);
    scanf("%50[^ ]s",kog);

    printf("%d %d %s",p,q,kog);

    return 0;
}
#包括
int main()
{
INTP;
int-q;
char kog[50];
scanf(“%d”和“p”);
scanf(“%d”和“&q”);
scanf(“%50[^]s”,角);
printf(“%d%d%s”,p,q,kog);
返回0;
}
您所说的:

scanf("%50[^ ]s",kog);
?

如果要扫描到打印新行,请尝试:

scanf(" %49[^\n]",kog);
顺便说一句,总是提到宽度说明符1小于字符串的大小。这是为了避免覆盖终止的空字符。因此,将49而不是50作为宽度说明符

发件人:

如果使用宽度说明符,则仅匹配最大宽度。除了匹配的字符外,始终存储空字符(因此参数数组必须至少有空间容纳宽度+1个字符)

另外,请注意,扫描集转换在
]
处完成。结构是
“%49[…]”
,仅此而已。一种常见的误解是扫描集后面应该跟着
s

并在
scanf()
中的
%
之前提供一个空格,以避免使用在上一个条目末尾输入的新行字符。

您的意思是:

scanf("%50[^ ]s",kog);
?

如果要扫描到打印新行,请尝试:

scanf(" %49[^\n]",kog);
顺便说一句,总是提到宽度说明符1小于字符串的大小。这是为了避免覆盖终止的空字符。因此,将49而不是50作为宽度说明符

发件人:

如果使用宽度说明符,则仅匹配最大宽度。除了匹配的字符外,始终存储空字符(因此参数数组必须至少有空间容纳宽度+1个字符)

另外,请注意,扫描集转换在
]
处完成。结构是
“%49[…]”
,仅此而已。一种常见的误解是扫描集后面应该跟着
s


并在
scanf()
中的
%
之前提供一个空格,以避免使用在上一个条目末尾输入的新行字符。

对于交互式输入读取行。您的扫描集将允许制表符和换行符,但不允许空白。它类似于
%50s
。此外,必须指定不包含空字节的长度,因此需要在格式中使用
49
而不是
50
(或将数组维度更改为
51
),以确保安全。off by one是历史性的,因此是神圣不可侵犯的,但不幸的是,它与指定缓冲区长度的大多数其他函数不一致。如果数字在单独的行上,您可能希望在扫描集(
%49[^]“
)之前留出一个空格,以跳过前面的
%d
留下的换行。关于这一行:
scanf(“%50[^]s”,kog)
用于字符字符串输入的函数
scanf()
将始终附加NUL字节,因此语句应为:
scanf(“%49[^]s”,kog)。另外,
[…]用于输入字符串,因此尾随的
s`不应该在那里,即使用:
scanf(“%49[^]”,kog)用于交互式输入读取行。扫描集将允许制表符和换行符,但不允许空白。它类似于
%50s
。此外,必须指定不包含空字节的长度,因此需要在格式中使用
49
而不是
50
(或将数组维度更改为
51
),以确保安全。off by one是历史性的,因此是神圣不可侵犯的,但不幸的是,它与指定缓冲区长度的大多数其他函数不一致。如果数字在单独的行上,您可能希望在扫描集(
%49[^]“
)之前留出一个空格,以跳过前面的
%d
留下的换行。关于这一行:
scanf(“%50[^]s”,kog)
用于字符字符串输入的函数
scanf()
将始终附加NUL字节,因此语句应为:
scanf(“%49[^]s”,kog)。另外,
[…]用于输入字符串,因此尾随的
s`不应该在那里,即使用:
scanf(“%49[^]”,kog)是的,我已经在scanf
scanf(“%49[^\n]”,kog)中提到了一个空格以避免使用新行。我已经添加了关于它的信息:)发布的代码包含一个“神奇”的数字。也就是说,50岁。”神奇的数字是没有基础的数字。建议给“神奇”数字起一个有意义的名字,然后在整个代码中使用这些有意义的名字。更好的代码顺序是:
#define MAX_STR_LEN 49。。。。char kog[MAX_STR_LEN+1]。。。scanf(“%”MAX_STR_LEN”[^]”,角)
实际上,宽度需要比输入缓冲区的实际长度小一倍,这样对
scanf()
的调用就不会超出输入缓冲区的末尾。是的,我已经提到scanf
scanf中的一个空格(“%49[^\n]”,kog)以避免使用新行。我已经添加了关于它的信息:)发布的代码包含一个“神奇”的数字。也就是说,50岁。”神奇的数字是没有基础的数字。建议给“神奇”数字起一个有意义的名字,然后在整个代码中使用这些有意义的名字。更好的代码顺序是:
#define MAX_STR_LEN 49。。。。char kog[MAX_STR_LEN+1]。。。scanf(“%”MAX_STR_LEN”[^]”,角)
实际上,宽度需要比输入缓冲区的实际长度小一倍,这样对
scanf()
的调用就不会超出输入缓冲区的末尾。