Char用Scanf存储整个字符串吗?

问题描述 投票:0回答:2

所以我在我的大学上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)?我知道第二个与标题并没有真正的联系,但我感谢您的回答,所以谢谢!

c char scanf
2个回答
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',然后检查它是否是句号

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

我希望可以解释您为什么得到。在输出中


1
投票

[是的,类型为char的变量可以容纳一个字符。它绝对不能容纳多个字符的字符串。

但是此程序不必包含多个字符的字符串。它读取并打印字符,然后读取并打印字符,等等。

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

根据您编写循环的方式,我希望它打印出'.',然后停止。仔细地遵循它:在循环中,它读取一个字符,并打印该字符,然后从循环中“返回顶部”,以决定是否应该再次循环。 (这是while循环的工作方式。)在读取并打印'.'后,条件while(c != '.')不再为真,因此循环停止-到那时,'.'已被打印。您的编译器没有任何问题。

您提到char升至127。实际上,一个8位char可以容纳2 8 = 256个不同的值。我们可以认为这些值的范围是-128到+127(如果char是有符号类型)或0到255(如果char是无符号类型)。普通ASCII字符的值始终小于128,因此表示这些字符不会有任何问题。其他128个值可以根据机器的字符集和编码以不同的方式使用。

© www.soinside.com 2019 - 2024. All rights reserved.