C语言 scanf()和接受用户输入的问题



我试图在用户输入与空格,并将其存储在字符数组。之后,我想要接收单个字符值并将其存储为字符。但是,当我运行代码时,字符的提示符被忽略,取而代之的是填充一个空格。我怎么能在一个字符数组后,仍然允许提示一个字符?

void main()
{
char userIn[30];
char findChar;

printf("Please enter a string: ");
scanf("%[^n]s", userIn);
printf("Please enter a character to search for: ");
scanf("%c", &findChar);
//this was put here to see why my single char wasnt working in a function I had
printf("%c", findChar);
}

scanf("%c", &findChar);读取输入流中挂起的下一个字符。该字符将是停止先前转换的用户输入的换行符,因此findChar将被设置为值'n',而不需要等待任何用户输入,printf将输出该换行符而不需要任何其他可见效果。

将调用修改为scanf(" %c", &findChar),以忽略挂起的空白并从用户处获取下一个字符,或者更可靠地写一个循环来读取输入行的读和忽略。

还要注意scanf("%[^n]s", userIn);是不正确的:

  • scanf()可以存储超过userIn结尾的字节,如果用户输入超过29字节。
  • ]之后的s是一个bug,字符类的转换格式不是%s转换的变体。

其他问题:

  • void不是main()函数返回值的合适类型。
  • 此代码需要<stdio.h>标头。

下面是修改后的版本:

#include <stdio.h>
int main() {
char userIn[30];
int c;
char findChar;
int i, found;
printf("Please enter a string: ");
if (scanf("%29[^n]", userIn) != 1) {
fprintf(stderr, "Input failuren");
return 1;
}
/* read and ignore the rest of input line */
while ((c = getchar()) != EOF && c != 'n')
continue;
printf("Please enter a character to search for: ");
if (scanf("%c", &findChar) != 1) {
fprintf(stderr, "Input failuren");
return 1;
}
printf("Searching for '%c'n", findChar);
found = 0;
for (i = 0; userIn[i] != ''; i++) {
if (userIn[i] == findChar) {
found++;
printf("found '%c' at offset %dn", c, i);
}
}
if (!found) {
printf("character '%c' not foundn", c);
}
return 0;
}

scanf("%[^n]s", userIn);有点奇怪。s保证不匹配,因为该字符将始终是n。此外,您应该使用宽度修饰符来避免缓冲区溢出。单独使用scanf("%29[^n]", userIn);并不能解决问题,因为下一次scanf将使用换行符。有几个选择。可以在第一次扫描中使用换行符:

scanf("%29[^n]%*c", userIn);

或在下次调用

时放弃所有空白
scanf(" %c", &findChar);

对于长度超过29个字符的输入行或当用户试图为findChar分配空白时,行为将有所不同,因此使用哪种解决方案将取决于您希望如何处理这些情况。

相关内容

  • 没有找到相关文章

最新更新