如何使用 scanf("%s", answer) 检查空白 space
How to check for a blank space with scanf("%s", answer)
所以,我正在处理这个程序,但遇到了 scanf 问题。我正在以字符串的形式扫描来自用户的输入,但是如果用户只是按回车键,scanf 不会接收它,光标只会继续移动,等待我为其编程寻找的任何指定输入。无论如何我可以通过与 0 或 1 进行比较来绕过这个问题,还是我需要以其他方式解决这个问题?是的,这是之前的同一个程序,我想在我做的另一个 post 中提到这个,但我认为这本身是一个不同的问题,所以它值得另一个 post 与我的其他问题分开早些时候。
/*
* Scott English
* CS 1412
* tconv
* 1/28/15
*/
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
FILE *
input_from_args(int argc, const char *argv[])
{
if (argc == 1){
return stdin;
}
else {
return fopen(argv[1], "r");
}
}
void
rot_13(FILE *src, FILE *dest)
{
int c,j;
while ((c = getc(src)) != EOF)
{
if(c>= 'A' && c <= 'Z')
{
if((j = c + 13) <= 'Z')
c = j;
else
{
j = c - 13;
c = j;
}
}
else if(c >= 'a' && c <= 'z')
{
if((j = c + 13) <= 'z')
c = j;
else
{
j = c - 13;
c = j;
}
}
else
c = c;
fprintf(dest, "%c", c);
}
}
void
convert_all_upper(FILE *src, FILE *dest)
{
int c;
while ((c = fgetc(src)) != EOF)
{
fprintf(dest, "%c", toupper(c));
}
}
void
convert_all_lower(FILE *src, FILE *dest)
{
int c;
while ((c = fgetc(src)) != EOF)
{
fprintf(dest, "%c", tolower(c));
}
}
void
print_all(FILE *src, FILE *dest)
{
int c;
while ((c = fgetc(src)) != EOF)
{
fprintf(dest, "%c", c);
}
}
int
main(int argc, const char *argv[])
{
char answer[4];
FILE *src = input_from_args(argc, argv);
FILE *dest = stdout;
printf("Please enter which conversion -r -u -l\n");
scanf("%s", answer);
if (src == NULL)
{
fprintf(stderr, "%s: unable to open %s\n", argv [0], argv[1]);
exit(EXIT_FAILURE);
}
else if (strcmp(answer,"-r") == 0)
{
rot_13(src, dest);
}
else if (strcmp(answer, "-u") == 0)
{
convert_all_upper(src, dest);
}
else if (strcmp(answer, "-l") == 0)
{
convert_all_lower(src, dest);
}
else
{
printf("%s: is unsupported\n", answer);
}
fclose(src);
return EXIT_SUCCESS;
}
从 LINK
中推导出来
scanf 代表 "scan formatted" 并且没有比用户输入的数据更少的格式。如果您可以完全控制输入数据格式,但通常不适合用户输入,那么这是理想的选择。
使用 fgets() 将您的输入转化为字符串,然后使用 sscanf() 对其求值。
一个简单的程序,向您展示如何拦截 'enter' 键。
#include<stdio.h>
#include<string.h>
int main()
{
char answer[4];
memset(answer, 0x00, sizeof(answer));
printf("Please enter which conversion -r -u -l\n");
fgets (answer, sizeof(answer), stdin);
if (strlen(answer) > 0)
{
if (answer[0] == '\n')
{
printf("Empty string and enter key pressed\n");
}
else
{
printf("Parameter %s", answer);
}
}
return 0;
}
我推荐使用 fgets:
fgets(answer, sizeof answer, stdin);
而不是 scanf,因为 scanf 会跳过包括换行符在内的空格,并且用户将无法退出输入循环。
"if the user just presses enter, scanf doesn't pick up on it" -->
scanf("%s", answer)
才刚刚开始。
"%s"
指定 scanf()
扫描 3 个东西:
1) 扫描并抛出所有领先的白色-space,包括 '\n'
、' '
、'\t'
和其他一些。
2)扫入保存无限个非白-spacechar
到answer
。完成后附加终止 '[=19=]'
。
3) 再次扫描白色-space 时,将char
放回stdin
以供稍后读取。
所以当用户输入输入或'\n'
时,scanf("%s", answer)
仍在第1步。
通常:混合使用 scanf()
和 fgets()/getc()
是有问题的。进一步建议不要对几乎所有应用程序使用 scanf()
。考虑:
// char answer[4];
// scanf("%s", answer);
char answer[4+1];
if (fgets(answer, sizeof answer, stdin) == NULL) return 1; // stdin closed
// now remove the potential trailing '\n`.
size_t len = strlen(answer);
if (len > 0 && answer[len-1] == '\n') answer[--len] = 0;
所以,我正在处理这个程序,但遇到了 scanf 问题。我正在以字符串的形式扫描来自用户的输入,但是如果用户只是按回车键,scanf 不会接收它,光标只会继续移动,等待我为其编程寻找的任何指定输入。无论如何我可以通过与 0 或 1 进行比较来绕过这个问题,还是我需要以其他方式解决这个问题?是的,这是之前的同一个程序,我想在我做的另一个 post 中提到这个,但我认为这本身是一个不同的问题,所以它值得另一个 post 与我的其他问题分开早些时候。
/*
* Scott English
* CS 1412
* tconv
* 1/28/15
*/
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
FILE *
input_from_args(int argc, const char *argv[])
{
if (argc == 1){
return stdin;
}
else {
return fopen(argv[1], "r");
}
}
void
rot_13(FILE *src, FILE *dest)
{
int c,j;
while ((c = getc(src)) != EOF)
{
if(c>= 'A' && c <= 'Z')
{
if((j = c + 13) <= 'Z')
c = j;
else
{
j = c - 13;
c = j;
}
}
else if(c >= 'a' && c <= 'z')
{
if((j = c + 13) <= 'z')
c = j;
else
{
j = c - 13;
c = j;
}
}
else
c = c;
fprintf(dest, "%c", c);
}
}
void
convert_all_upper(FILE *src, FILE *dest)
{
int c;
while ((c = fgetc(src)) != EOF)
{
fprintf(dest, "%c", toupper(c));
}
}
void
convert_all_lower(FILE *src, FILE *dest)
{
int c;
while ((c = fgetc(src)) != EOF)
{
fprintf(dest, "%c", tolower(c));
}
}
void
print_all(FILE *src, FILE *dest)
{
int c;
while ((c = fgetc(src)) != EOF)
{
fprintf(dest, "%c", c);
}
}
int
main(int argc, const char *argv[])
{
char answer[4];
FILE *src = input_from_args(argc, argv);
FILE *dest = stdout;
printf("Please enter which conversion -r -u -l\n");
scanf("%s", answer);
if (src == NULL)
{
fprintf(stderr, "%s: unable to open %s\n", argv [0], argv[1]);
exit(EXIT_FAILURE);
}
else if (strcmp(answer,"-r") == 0)
{
rot_13(src, dest);
}
else if (strcmp(answer, "-u") == 0)
{
convert_all_upper(src, dest);
}
else if (strcmp(answer, "-l") == 0)
{
convert_all_lower(src, dest);
}
else
{
printf("%s: is unsupported\n", answer);
}
fclose(src);
return EXIT_SUCCESS;
}
从 LINK
中推导出来scanf 代表 "scan formatted" 并且没有比用户输入的数据更少的格式。如果您可以完全控制输入数据格式,但通常不适合用户输入,那么这是理想的选择。
使用 fgets() 将您的输入转化为字符串,然后使用 sscanf() 对其求值。
一个简单的程序,向您展示如何拦截 'enter' 键。
#include<stdio.h>
#include<string.h>
int main()
{
char answer[4];
memset(answer, 0x00, sizeof(answer));
printf("Please enter which conversion -r -u -l\n");
fgets (answer, sizeof(answer), stdin);
if (strlen(answer) > 0)
{
if (answer[0] == '\n')
{
printf("Empty string and enter key pressed\n");
}
else
{
printf("Parameter %s", answer);
}
}
return 0;
}
我推荐使用 fgets:
fgets(answer, sizeof answer, stdin);
而不是 scanf,因为 scanf 会跳过包括换行符在内的空格,并且用户将无法退出输入循环。
"if the user just presses enter, scanf doesn't pick up on it" -->
scanf("%s", answer)
才刚刚开始。
"%s"
指定 scanf()
扫描 3 个东西:
1) 扫描并抛出所有领先的白色-space,包括 '\n'
、' '
、'\t'
和其他一些。
2)扫入保存无限个非白-spacechar
到answer
。完成后附加终止 '[=19=]'
。
3) 再次扫描白色-space 时,将char
放回stdin
以供稍后读取。
所以当用户输入输入或'\n'
时,scanf("%s", answer)
仍在第1步。
通常:混合使用 scanf()
和 fgets()/getc()
是有问题的。进一步建议不要对几乎所有应用程序使用 scanf()
。考虑:
// char answer[4];
// scanf("%s", answer);
char answer[4+1];
if (fgets(answer, sizeof answer, stdin) == NULL) return 1; // stdin closed
// now remove the potential trailing '\n`.
size_t len = strlen(answer);
if (len > 0 && answer[len-1] == '\n') answer[--len] = 0;