【问题标题】:How %c and %s works in C language?%c 和 %s 在 C 语言中是如何工作的?
【发布时间】:2014-12-29 16:58:16
【问题描述】:

在这里,%s 将继续打印,直到它获得终止字符,即 \0

%c 如何知道终止并最终只打印一个字符?

【问题讨论】:

  • 它总是打印 1 个字符,不需要魔法
  • man7.org/linux/man-pages/man3/printf.3.html(猜你想问printf。在这种情况下,你真的应该阅读文档,为方便起见链接。)
  • 使用%c 格式,printf 不需要知道终止。
  • 顺便说一句,它是 '\0' 而不是 '/0'。

标签: c char printf


【解决方案1】:

%c 总是打印一个字符。

char x = 'a';

这里我们有一个需要打印的字符 a。

char x[2] = "a";

在上面的示例中,我们有 2 个字符,一个是 'a',另一个是 '\0'

所以在打印时我们需要使用 %s 以便它遇到字符串结尾彻底 '\0' 并打印字符串。

【讨论】:

    【解决方案2】:

    %c 表示字符,范围是 0x00 到 0xff(无符号),即 1 个字节,一个内存位置可以保存 1 个字节的数据,%c 将仅从一个内存位置打印数据,因此不需要终止字符。

    %s 表示字符流意味着它必须从内存位置流中获取数据,因此它需要一个终止字符,因此 %s 需要 '\0'。

    【讨论】:

      【解决方案3】:

      字符串格式化不是 C 或该语言的特性。 Is 是 C 运行时库提供的一种工具。

      "%c" 不需要终止符,因为它只处理一个字符。

      "%s" 继续处理字符,直到遇到在 C 中表示为 '\000'(或 '\0')的 ASCII NUL 字符。字符串或字符常量中的正斜杠是可打印的字符,没有任何特殊含义。

      此外,几乎每个 C 运行时库都提供了对 %s 长度的更多控制:

      • 如果没有遇到 NUL,%.123s 最多处理 123 个字符
      • %.*s 需要两个匹配参数:第一个是指定最大字段宽度的整数,第二个是字符指针。示例:printf ("x = %.*s\n", 15, ptr);

      【讨论】:

        【解决方案4】:

        %c%s 是标准库中 printf() 函数的一部分,而不是语言本身的一部分。

        话虽如此,printf() 使用% 后面的字符以及stdarg 函数来确定它将从其参数中读取什么类型的变量以及它将如何处理它。 printf() 的高度简化实现可能如下所示。

        请特别注意%c%s 确实处理相同类型的参数! %c 处理 char(即单个字符),而 %s 处理 char *(即指向字符数组的指针,希望以空字符结尾)。

        int printf(const char *fmt, ...)
        {
            va_list ap;
            va_start(ap, fmt);     // Initialize stdargs
        
            const char *p = fmt;   // Pointer into the format string
            while (*p != '\0') {
                char ch = *p++;    // Get the next character of the format string
        
                if (ch != '%') {   // Not a format character? Just print it
                    putchar(ch);
                    continue;
                }
        
                char fmt = *p++;   // Get the character following the %
        
                if (fmt == 'd') {
                    int n = va_arg(ap, int);
                    print_number(n);
        
                if (fmt == 'c') {
                    char c = va_arg(ap, char);
                    putchar(c);
        
                } else if (fmt == 's') {
                    char *str = va_arg(ap, char *);
                    print_string(str);
        
                } else {
                    // Unrecognized format character
                }
            }
        
            va_end(ap);
        
            return n;
        }
        

        【讨论】:

        • ---> int c = va_arg(ap, int); putchar(c);
        猜你喜欢
        • 1970-01-01
        • 2016-11-13
        • 1970-01-01
        • 2014-02-09
        • 1970-01-01
        • 2016-08-09
        • 1970-01-01
        • 2012-12-29
        • 2019-07-27
        相关资源
        最近更新 更多