【问题标题】:Char stores entire strings with Scanf?Char 用 Scanf 存储整个字符串?
【发布时间】:2019-10-02 15:14:36
【问题描述】:


所以我正在我的大学学习 C 语言,教授展示了这段简单的代码:

#include <stdio.h>

int main() {
    char c;
    scanf("%c", &c);
    while (c !='.'){
        //if(c != '/n');
        scanf("%c", &c);
        printf("%c", c);
    }
    return 0;
}

虽然对于你们中的许多人来说,这是一段客观上简单的代码,但我无法理解两件事。第一件事是,如果您运行代码,我可以存储整个字符串(通过写入scanf())并将代码吐回给我。但是我存储它的变量是一个类型char,它只上升到127,它基于我输入的字符的ASCII值,还不够,那么它是如何存储的呢?
其次,我正在从内存中编写此代码(尽管我认为它与我的教授使用的代码完全相同)。但是,在他的代码中,程序在检测到句号“。”后停止,并且程序在不打印点的情况下打印其最终字符串,但我的却是。我想知道是不是写错了,或者我的编译器有问题(Clion,Mac上的lang)?
我知道第二个与标题并没有真正的关系,但我感谢答案,所以谢谢!

【问题讨论】:

  • 我建议您将printf 行更改为printf("%d\n", c);,这样您就可以看到实际值而不会被空格误导。
  • 代码不读取或打印字符串。它读取并打印单个字符。
  • 此外,当今使用的几乎所有系统都使用ASCII 编码字符,而ASCII 是7 位编码(值从0127)。所以它非常适合(签名)char
  • 如果你的程序表现得不像教授的那样,那就不一样了。请注意,在循环中,您暂时 之前输出字符,下一个循环的while 测试找到'.'。还要注意,您永远不会输出循环外的第一个 scanf 的结果。我建议你将printf 上移一行。
  • 我将如何更改它以使代码结束并且不打印出'。'最后?

标签: c char scanf


【解决方案1】:
  1. 在您的 while 循环中,它不会将输入的字符存储为字符串。 它将继续用新值替换(覆盖)旧值,并在存储后立即在 c 中打印该新值。字符类型变量一次只能保存 1 个字符。 简而言之,您将从键盘输入的值将存储在变量 c“通过替换”旧值中。 因此,在任何时候 c 都只会存储 1 个字符,这是使用 scanf 读取的最新字符。

您提到的 127 .. 在任何地方您都会发现 char 的范围从 -127 到 128 对。这并不意味着您可以在其变量中存储 127 个字符,而是意味着您可以在其变量中存储 256 种字符。了解有关 ASCII 值的更多信息。每个字符都有一个与之关联的 ASCII 值,因为字符在内部表示为整数。

阅读有关 ASCII 值的更多信息 你可以参考这些文章

https://www.cs.cmu.edu/~pattis/15-1XX/common/handouts/ascii.html

https://www.atnyla.com/tutorial/char-data-type-in-c/1/178

2。 关于句号 在你的循环条件下,你有

while( c !=  '.' ){
    scanf("%c", &c);
    printf("%c", c);
}

您的程序打印句号 因为从时间来看

  1. 它将检查 ch 是否等于 '.'它不是句号它会进去 例如,假设我输入: a 作为第一个字符,然后 。作为第二个角色 最初在 while 循环之前,您已经输入了一些字符。因此,如果您输入第一个字符作为句号,您的循环将不会执行.. 但如果不是 假设您输入:abc。 循环体之前的 scanf 将执行并取 'a' 它不是句号它会打印'a' 现在 c 有'a' 然后它会检查 a=='.'这是错误的 循环将执行并接受输入'b' 它将打印'b'然后检查它是否是句号 它不是 循环将再次执行并接受输入。你输入了'c' 它将打印'c'然后检查它是否是句号

聚焦 现在 c 变量的值为“c”。它不是 '。' 循环条件 'c' 不等于 '.'循环将执行 它将使用 scanf 进行输入 现在你输入了'.'即,c 是 '.'现在enter code here 它将转到下一行 并打印 c 即 '.' 然后将再次检查现在 c 是否等于 '.' 因此循环将终止

我希望这能解释你为什么会得到 .在输出中

【讨论】:

    【解决方案2】:

    没错,char 类型的变量可以容纳一个字符。它绝不可能包含多个字符的字符串。

    但是这个程序不必保存一个由多个字符组成的字符串。它读取一个字符并打印它,读取一个字符并打印它等等。

    如果您使用scanf %s 读取和存储整个字符串,并使用printf %s 打印该字符串,那么是的,您需要一个包含多个字符的数组。

    根据循环的编写方式,我希望它打印'.',然后停止。仔细遵循它:在循环内部,它读取一个字符并打印该字符,然后它“回到顶部”离开循环以决定是否应该再次通过 thw 循环。 (这就是while 循环的工作方式。)在读取并打印'.' 之后,条件while(c != '.') 不再为真,因此循环停止——但此时'.' 已被打印。你的编译器没有问题。

    您提到char 最高可达 127。实际上,一个 8 位的 char 可以容纳 28 = 256 个不同的值。我们可以将这些值视为从 -128 到 +127(如果 char 是有符号类型)或 0 到 255(如果 char 是无符号类型)。普通的 ASCII 字符总是有小于 128 的值,所以表示它们从来没有任何问题。其他 128 个值可以根据您机器的字符集和编码以不同方式使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-11
      • 2019-07-02
      • 1970-01-01
      • 1970-01-01
      • 2017-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多