【问题标题】:Why is the printf specifiers, "%s", printing multiple variables at once?为什么 printf 说明符“%s”一次打印多个变量?
【发布时间】:2019-11-30 00:14:19
【问题描述】:

我声明了四个字符串变量并以四种不同的方式进行了初始化。然后我使用 printf 函数四次,顾名思义,将四个字符串变量打印到控制台。

我已经尝试一次打印一个,但没有成功。第一次尝试后,我尝试使用转义序列,但没有奏效。然后我尝试在网上搜索找到打印字符串的正确方法,但我发现的所有内容都使用 printf 函数返回。

#include <stdio.h>
int main() {
    char name1[] = "Ignacio";
    char name2[8] = "Ignacio";
    char name3[] = {'D', 'i', 'e', 'g', 'o'};
    char name4[5] = {'D', 'i', 'e', 'g', 'o'};

    printf("Name: %s\n", name1);
    printf("Name: %s\n", name2);
    printf("Name: %s\n", name3);
    printf("Name: %s\n", name4);

    return 0;
}

预期输出:

Name: Ignacio
Name: Ignacio
Name: Diego
Name: Diego

实际输出:

Name: Ignacio
Name: Ignacio
Name: DiegoIgnacio
Name: DiegoDiegoIgnacio

【问题讨论】:

    标签: c printf c-strings


    【解决方案1】:

    当您初始化 char[] 时,会隐式添加一个空终止字符,如下所示:

    char myStr[] ="Ignacio";

    如果你想用单个字符初始化一个 char[],你必须像下面这样初始化它,因为空终止字符必须显式添加:

    char myStr[] ={'I', 'g', 'n', 'c', 'i','0','\0'})

    您的案例中的行为说明:

    内存布局:

    [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [A] [B] [C] [D] [E] [F] [10] [11]

    'D' 'i' 'e' 'g' 'o' 'D' 'i' 'e' 'g' 'o' 'I' 'g' 'n' 'a' 'c' 'i' 'o' '\0'

    初始化字符串后,字符会像上面一样排列在内存中。在 C 语言中,所有有效字符串的结尾都必须有一个空终止字符,以明确字符串的结尾。原因是 printf 只会从传递给它的 char* 的地址开始,并且会继续读取字符,直到遇到 '\0' 字符。因此,如果您将地址传递给printf 一个不包含'\0' 的字符数组,那么printf 将继续通过这些字符进入内存,直到遇到空终止字符。 (这可能会导致分段错误)

    输出说明:(参考上面的内存布局)

    Name: DiegoIgnacio

    printf 将从索引 [5]​​ 开始,并将打印所有字符,直到 '\0' 字符,因此 "DiegoIgnacio" ([5] - [11]) 是输出。

    Name: DiegoDiegoIgnacio

    printf 将从索引 [0] 开始,并将打印所有字符,直到 '\0' 字符,因此 "DiegoDiegoIgnacio" ([0] - [11]) 是输出。

    【讨论】:

      【解决方案2】:
      char name3[] = {'D', 'i', 'e', 'g', 'o'};
      char name4[5] = {'D', 'i', 'e', 'g', 'o'};
      

      这两个不是字符串,因为它们不是以空值结尾的。

      试试:

      char name3[] = {'D', 'i', 'e', 'g', 'o', '\0'};
      char name4[6] = {'D', 'i', 'e', 'g', 'o', '\0'};
      

      【讨论】:

        猜你喜欢
        • 2012-07-20
        • 2013-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-07
        • 1970-01-01
        相关资源
        最近更新 更多