c - 如何使用 scanf ("%s"检查空格,答案)

标签 c whitespace

所以,我正在处理这个程序,但遇到了 scanf 问题。我正在以字符串的形式扫描来自用户的输入,但是如果用户只是按回车键,scanf 不会接收它,光标只会继续移动,等待我为其编程寻找的任何指定输入。无论如何我可以通过与 0 或 1 进行比较来绕过这个问题,还是我需要以其他方式解决这个问题?是的,这是之前的同一个程序,我想在我发表的另一篇文章中提到这个,但我认为这本身是一个不同的问题,所以它应该与我之前的其他问题分开发表另一篇文章。

/* 
* 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 代表“扫描格式化”,几乎没有比用户输入的数据更少的格式化。如果您可以完全控制输入数据格式,但通常不适合用户输入,那么这是理想的选择。

使用 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;
}

关于c - 如何使用 scanf ("%s"检查空格,答案),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28273145/

相关文章:

C语言。 TCP 服务器-客户端,字符串传递错误

c - 将结构中数组的值读入下一个索引值?

html - Jade - 控制 HTML 输出中的换行符

html - 没有pre,nbsp或空白:pre,如何在HTML中显示多个空格?

php - 为什么 Internet Explorer 9 在 UTF8 和空白内容上显示奇怪的字符?

c - 需要有关使数组出队的帮助

c - c 中的包装函数

c - 避免丢失集群上运行的作业的数据

ios - UITextField 没有空格且最大字符数限制

html - 如何去掉菜单中的空格