【问题标题】:Code for changing case of the entered String in C在C中更改输入字符串的大小写的代码
【发布时间】:2018-07-01 15:37:00
【问题描述】:
#include <stdio.h>

int main()
{
    int c;
    while ( (c = getchar()) != EOF )
    {
        if (c >= 65 && c <= 90)
            c += 32;
        else if (c >= 97 &&c <= 122)
            c -= 32;
        putchar(c);
    }
    return 0;
}

在代码中如何解释、处理和打印输入?

例如,如果我们输入abcde,我们会得到输出ABCDE。由于我们正在逐个字符地处理输入,我们应该逐个字符地获取输出,但是一旦我们按下回车键就会得到输出。直到我们按下回车,输出存储在哪里。

【问题讨论】:

  • 终端一般会缓冲文本,直到你按下“回车”,此时终端将输入发送给程序。
  • 使用islower()isupper()tolower()toupper()。不要对字符集做出不可移植的假设。
  • 试试这个:for i in {1..10}; do echo $i; done | ./yourExecutable。你明白它是如何一张一张打印出来的吗?每次迭代时,“for”命令都会简单地刷新缓冲区。现在尝试编写一个 C 程序,每 3 个字符刷新一次输出流并将其输出通过管道传输到您的程序。看看它是如何运作的。如果还没有,那就有意义了
  • 直到你按下回车键,没有输入,所以没有输出可以存储在任何地方。
  • 这是一段可读性差的代码,最好用if (c &gt;= 'A' &amp;&amp; c &lt;= 'Z') ...; else if (c &gt;= 'a' &amp;&amp; c &lt;= 'z') ... 编写(或者干脆使用ctype.h 转换)除非你想使用@,否则你只能使用320x20 987654334@(不利于可读性)。

标签: c getchar putchar


【解决方案1】:

有什么功能?

  • getchar() 是一个用于从
    获取单个字符的函数 控制台。

putchar() 是一个函数,用于返回写入的字符 作为 unsigned char 转换为 int。

#include <stdio.h>
int main()
{
    int c;  
    while ( (c=getchar()) != EOF ){ 
        if (c >= 65 && c <= 90)
            c += 32;
        else if (c >= 97 &&c <= 122)
            c -= 32;
        putchar(c);
    }
  return 0;
}

c 是 int,因此当您从键盘读取字符时,它会将其存储为整数而不是字符。 结帐 ASCII。

所以 65 = A,90 = Z,97 = a,122 = z,

这是我从代码中理解的:

  1. 创建变量 c 来存储我们的角色。
  2. 从用户那里获取字符并将其存储到 c。
  3. 而 c 不等于 EOF(文件结尾)
  4. 如果 c 大于或等于 65 且 c 小于或等于 90
  5. c 加 32
  6. 否则如果 c 大于 97 且 c 小于或等于 122
  7. c 减去 32
  8. 将 c 值返回为字符并打印。

【讨论】:

  • 这如何回答 OP 的问题?
【解决方案2】:

首先,我很感激您提出了一个大多数程序员都不会想到的好问题。在这篇文章中,我尽力解决了这个问题。

队列:遵循主体先进先出。原则类似于排队等待购买新 iPhone 的人所遵循的优先级。

输入流的行为类似于队列。将其视为史酷比。即使它吃了什么也足够了,它不会停止进食。如果有人在早餐中提供两吨食物,史酷比会吃掉所有的早餐,但仍然要午餐。

输入流类似于史酷比。看这段代码!

 char c=getchar();

这里一个字符对于 c 来说就足够了,但是当你运行这段代码时。您可以在控制台中输入任意数量的字符,但无论何时按 enter 输入:c 都会分配给您输入的第一个字符。

但请注意,检查 EOF 是一种不好的做法,原因有很多,我将在最后列出原因。

当您提出问题时!。为什么字符没有一个一个打印出来?

研究流本身是一个很大的领域。因此,为了您的方便,输入流将有一些隐藏文件(队列)来存储您输入的任何字符。 在流中键入字符就像机枪连续射击。没有选择你必须等待机枪停止射击才能进行反击。

同样,当您在流中键入字符时,文件将简单地将每个字符推入其中。一旦你输入了 enter 或 EOF 命令'Cntl+D'。

然后您的代码将逐个字符地查看文件(记住主体第一个 IN)。如果满足条件,它将在那里停止执行,并且不会关心文件中的下一个剩余字符。

在您的情况下,它会在用户输入 enter 或 EOF 命令后查看文件中的所有字符,并且会更改它们的大小写(从大到小,反之亦然)

正如我所承诺的! 为什么不应该检查 EOF!

  • 一个原因是从 键盘不是标准的,但平台之间有所不同。

  • 另一个原因是最好更明确地终止程序 (例如,使用“退出”命令)。

  • 第三个原因是可能会出现其他错误情况,并且此检查不会检测到它们。

所以尽量避免。

【讨论】:

  • char c=getchar(); -> int c = getchar();
  • @chqrlie 为了便于理解,我使用了 char 显然 char 足以容纳 EOF 命令。
  • 完全不是! char 不足以存储 getchar() 的返回值。 getchar() 返回一个int,它具有流中下一个可用字节的值作为unsigned char 或特殊的负值EOFchar 无法明确存储所有这些不同的值。用char 值测试EOF 要么不明确(如果char 有符号,则\377 无法与EOF 区分开来)或不可能(char 是无符号的,它不能比较等于@987654337 @.
【解决方案3】:

stdin 和 stdout 是缓冲流。您可以将它们设置为无缓冲,但这可能会导致显着的性能下降。而且,即使您将它们设置为无缓冲,它仍然可能无法从终端界面生效,因为终端通常会自己进行缓冲。

有关更多信息,请参阅此内容: Should I set stdout and stdin to be unbuffered in C?

【讨论】:

    猜你喜欢
    • 2011-05-04
    • 2023-03-09
    • 2011-10-11
    • 2011-01-07
    • 1970-01-01
    • 2021-03-30
    • 2014-04-20
    • 2014-02-04
    • 1970-01-01
    相关资源
    最近更新 更多