我试图在用户输入与空格,并将其存储在字符数组。之后,我想要接收单个字符值并将其存储为字符。但是,当我运行代码时,字符的提示符被忽略,取而代之的是填充一个空格。我怎么能在一个字符数组后,仍然允许提示一个字符?
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
分配空白时,行为将有所不同,因此使用哪种解决方案将取决于您希望如何处理这些情况。