这应该是 int,那我们为什么要使用 %s?

This should be int, why are we using %s then?

我正在做 CS50 练习,我不明白这段代码。它所做的一切都是将一个正整数作为输入,然后 printf。所以在 main() 中,我们将输入保存在 int i 中。

在下一步中,int i 用作函数 get_positive_int ("string prompt") 的 parameter/argument(?)。

为什么是字符串?这怎么可能?我原以为必须使用类型转换才能发生这种情况......

请随时指正,我迷路了。

// Abstraction and scope

#include <cs50.h>
#include <stdio.h>

int get_positive_int(string prompt);

int main(void)
{
    int i = get_positive_int("Positive integer: ");
    printf("%i", i);
}

// Prompt user for positive integer
int get_positive_int(string prompt)
{
    int n;
    do
    {
        n = get_int("%s", prompt);
    }
    while (n < 1);
    return n;
}

根据documentationget_int 将提示格式设置为printf。所以这里的%s就是printf的格式化字符串,第二个参数(prompt)就是%s.

打印出来的字符串

换句话说,这里的格式字符串仅用于输出。无需为输入指定格式字符串(如 scanf),因为该函数已经知道它正在输入 int.

In the next step int i is used as a parameter/argument(?) for the function get_positive_int ("string prompt").

不完全是。

i 收到 get_positive_int 返回的值。 字符串 "Positive integer" 参数 get_positive_intget_positive_int 将该字符串 (prompt) 传递给 get_int,后者执行将提示字符串写入标准输出并读取您输入的输入的实际工作。

get_int 显然是调用了 vprintf。所有 *printf 函数都需要一个 格式字符串 来告诉它们需要多少个额外的参数,它们的类型是什么,以及它们的值应该如何格式化输出。在这种特殊情况下,我们告诉 vprintf 期望类型为 string (char *) 的单个参数。

可以为get_int写更复杂的提示,比如

i = get_int( "Enter the %d'th name: ", count );

如果count是5,那么提示会写成

Enter the 5'th name:

get_int 然后调用 C 的输入函数(fgetsfscanf 等)来读取和解析您输入的内容并确保它是一个有效的整数。

<无端咆哮>

CS50 库抽象掉了 C I/O 和字符串处理的大部分细节,这很好,但在此过程中让您完全没有准备好 C 中文本处理的现实 - 它比 CS50 看起来要难很多

完成 CS50 后,扔掉 它教给你的关于字符串和 I/O 的所有内容 并找一本像样的 C 参考手册。准备从头开始。