c - 如何将 getchar() 输入与 getchar() 中的先前输入进行比较?

标签 c

我正在尝试比较用户插入的两个(或更多)输入。 我正在为它使用 getchar() 函数,但它似乎不起作用...... 我需要先检查它的字母(英文),以及是否连续没有 2 个(或更多)大写或小写字母。 这是我所做的:

Boolean CheckLetters() {
    char ch1, ch2;
    Boolean valid = TRUE, loop = TRUE;
    printf("\nPlease enter char. When you are done press Enter.\n");
    ch1 = getchar();
    while (getchar() != 10);
    if ((ch1>='A' && ch1<='Z') || (ch1>='a' && ch1<='z')) {
        return valid;
    }
    ch2 = ch1;
    printf("\nbdika1");
    ch1 = getchar();
    while (getchar() != 10);
    while (loop)
    {
        if (ch1 != 10) {
            if (((ch1 >= 'A' && ch1 <= 'Z') && (ch2 >= 'a' && ch2 <= 'z')) ||
                ((ch1 >= 'a' && ch1 <= 'z') && (ch2 >= 'A' && ch2 <= 'Z'))) {
                ch2 = ch1;
                printf("\nbdika2");
                ch1 = getchar();
                while (getchar() != 10);
            }
            else
            {
                valid = FALSE;
                loop = FALSE;
            }
        }
        else
        {
            loop = FALSE;
        }
    }
    return valid;
}

valid 的值被返回给另一个函数,如果它是 true,函数打印“correct”,如果是 false,则相反。 现在不知何故它不能正常工作..我不知道出了什么问题,我将 ch2 插入 getchar() 插入到 ch1 的值并接收新值并检查它,但返回的值不是那个值假设要返回...

编辑:

好的,事情就是这样。 我需要编写一个函数,从用户那里获取一串字符(不使用数组或字符串),当用户按下 Enter 键或空格键时,它会停止并在这种情况下打印“正确”:

a) 如果用户输入了 0 个字符。

b) 如果用户输入了 1 个字符,并且该字符是一个字母。

c) 如果字符串是这样的:AaAa 或 aBcD(大写和小写彼此相邻)

在这种情况下函数会打印“Incorrect”:

a) 输入的字符不是字母

b) 2个(或更多)大写/小写字母彼此相邻

"printf("bdika")(bdika 表示检查我的语言)只是为了检查“如果”是否为真。 现在不知为什么我写的代码不起作用。请尝试帮助我了解哪里出了问题以及我可以做哪些改变。

注意 打印是由另一个函数完成的,它从前一个函数接收 True 或 False。如果它收到 true,它会打印“Correct”,否则打印“Incorrect”。

最佳答案

您的代码中存在多个问题:

  • 你应该定义 ch1ch2 类型为 int 因为 getchar() 返回一个 int 可以具有 unsigned char 类型的所有值 加上 特殊值 EOFchar 类型无法保存所有这些值,并且无法使用此类型可靠地完成文件末尾检查。

  • 您应该使用字符常量而不是硬编码的数值:使用 '\n' 而不是 10...

    <
  • 循环时始终检查 EOF,直到键入给定字符,否则循环将无限期地运行到文件末尾。

  • 您不处理用户在提示符下直接点击的情况。在这种情况下不应运行冲洗循环。您可以为此编写实用函数以避免重复代码。

  • 我不确定为什么当用户输入字母时您会立即返回。逻辑不清,目标也没有说清楚。

编辑 您终于阐明了用户输入的预期行为:一次只读取一个字符并重置返回值是字符不正确(不是字母)或者如果您检测到不正确的序列(同案)。

这是修改后的独立版本:

#include <stdio.h>

typedef int Boolean;
#define TRUE   1
#define FALSE  0

Boolean CheckLetters(void) {
    int valid = TRUE;  // input is correct by default
    int ch1, ch2;

    // to avoid leaving characters in the input stream, the loop
    // reads all characters typed by the user upto the <enter> key.
    // return FALSE if an invalid character or an invalid sequence
    // is detected.
    printf("\nPlease enter chars. When you are done press Enter.\n");
    for (ch1 = EOF;;) {
        ch2 = ch1;      // save previous character
        ch1 = getchar();
        if (ch1 == EOF || ch1 == '\n') {
            // end of line or end of file, return status
            return valid;
        }
        if (ch1 >= 'A' && ch1 <= 'Z') {
            // character is uppercase letter,
            // check if previous character if any is lowercase
            if (!(ch2 == EOF || (ch2 >= 'a' && ch2 <= 'z'))) {
                // invalid sequence, will return Incorrect status
                valid = FALSE;
            }
        } else
        if (ch1 >= 'a' && ch1 <= 'z') {
            // character is lowercase letter,
            // check if previous character if any is uppercase
            if (!(ch2 == EOF || (ch2 >= 'A' && ch2 <= 'Z'))) {
                // invalid sequence, will return Incorrect status
                valid = FALSE;
            }
        } else {
            // character is not a letter, Incorrect status
            valid = FALSE;
        }
    }
}

int main(void) {
    Boolean valid = CheckLetters();
    if (valid) {
        printf("Correct\n");
    } else {
        printf("Incorrect\n");
    }
    return 0;
}

关于c - 如何将 getchar() 输入与 getchar() 中的先前输入进行比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41081592/

相关文章:

c - 启用 for 循环的强制矢量化

c - 从 block 外访问 block 内自动变量的内存?

c - 如果我们不知道字符串的大小并且无法动态分配内存,有没有办法用 sscanf 标记字符串?

c - 应为 ‘int *’,但参数的类型为 ‘int (*)[(long unsigned int)(n)]’

c - 未知类型输入 - windows.h

c - 生成一个 N 位的随机整数?

c - 如何准确地调用 25 字节

递归函数调用期间的 C 运行时错误

clockid_t(clock_gettime 第一个参数)可移植性

c - 将一些数据写入文件后出现段错误