首页 > 解决方案 > Char 用 Scanf 存储整个字符串?

问题描述


所以我正在我的大学学习 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,
我知道第二个与标题并没有真正的关系,但我很欣赏答案,所以谢谢!

标签: ccharscanf

解决方案


  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);
}

你的程序打印句号因为从 while 看到

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

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

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


推荐阅读