当我输入以下代码程序退出之前,我输入字2的任何字符串。即不执行scanf-word2。为什么?我正在使用mac而我无法在codelite和terminal(使用make)中执行第二次scanf
#include <stdio.h>
int main()
{
char word1[20], word2[20];
printf("enter word 1 : ");
scanf("%[^\n]s",&word1);
printf("enter word 2 : ");
scanf("%[^\n]s",&word2);
}
答案 0 :(得分:4)
您正在向scanf()
发送错误的参数类型以扫描字符串,不检查空格 ...而是以这种方式使用scanf
:
scanf("%19[^\n]",word1);
//and also
scanf(" %19[^\n]",word2);
// a space in front to consume white spaces and don't put & before string variable
scanf()
扫描字符串时,要发送的参数必须是char*
但不是char
word1
和word2
的类型为char*
,而word1[i]
和word2[i]
的类型为char
%19[^\n]
只允许扫描19
个字符,包括空格(即'\0'
,'\n'
' '
),并会留下最后一个用于终止空字符的索引'\0'
。这里有19个被称为width field (点击了解更多) 进一步阅读:
Why does everyone say not to use scanf? What should I use instead?
答案 1 :(得分:2)
如果您阅读手册页scanf
然后这一点没有意义
scanf("%[^\n]s",&word1);
应该是
if (scanf("%19[^\n]",word1) == 1) ....
同样适用于word2
修改强>
对于第2个单词
if (scanf("\n%19[^\n]",word2) == 1) ....
答案 2 :(得分:0)
通过将最大字符数传递给scanf
来防止缓冲区溢出,并使用虚拟格式跳过'\n'
:
#include <stdio.h>
int main(void) {
char word1[20], word2[20];
printf("Enter word 1: ");
fflush(stdout); // make sure prompt is output
if (scanf("%19[^\n]%*c", word1) < 1)
return 1;
printf("Enter word 2: ");
fflush(stdout); // make sure prompt is output
if (scanf("%19[^\n]%*c", word2) < 1)
return 1;
return 0;
}
请注意,使用scanf
读取行会产生一些副作用:您无法以这种方式读取空行,并且必须以笨拙的方式对格式字符串中的缓冲区大小进行硬编码。
我建议使用fgets()
并以这种方式剥离'\n'
:
#include <stdio.h>
#include <string.h>
int main(void) {
char word1[20], word2[20];
printf("enter word 1 : ");
fflush(stdout); // make sure prompt is output
if (fgets(word1, sizeof word1, stdin) == NULL)
return 1;
word1[strcspn(word1, "\n")] = '\0'; // strip the \n if any
printf("enter word 2 : ");
fflush(stdout); // make sure prompt is output
if (fgets(word2, sizeof word2, stdin) == NULL)
return 1;
word2[strcspn(word2, "\n")] = '\0'; // strip the \n if any
printf("word1: |%s|, word2: |%s|\n", word1, word2);
return 0;
}
答案 3 :(得分:-1)
您需要在第二个int? nullableValue = null;
int intValue = nullableValue.GetValueOrDefault(10);
之前添加getchar()
缓冲区中已有scanf();
个字符。在第二个'\n'
操作中,它读取该字符并终止该程序。