1

我对这行代码有疑问:

scanf("%s %s %s", &op, &s1, &s2);
opPtr = &op;
s1Ptr = &s1;
s2Ptr = &s2;

if (strcmp(opPtr, "^") == 0 && (strcmp(s1Ptr, "A") == 0) && (strcmp(s2Ptr, "") == 0))
    matrix_transpose(matA, ArowsPtr, AcolsPtr);

scanf(op, s1, s2)的目的是让用户输入对两个矩阵(s1 和 s2)的操作以及对它们的操作(op)。这包括 op = "*" || "+" || “^”,其中“^”是转置。

对于转置,我只需要 s1。因此,用户将输入“^ A[ENTER]”,然后 matA、ArowsPtr 和 AcolsPtr 将被调用到 matrix_transpose 函数中。

我的问题是当输入的操作是 '^' 时,我不明白如何忽略 s2Ptr 。我尝试将 s2Ptr 设置为空字符串并将 '\n' 添加到 strcmp(s1Ptr, "A\n") == 0 但这无助于忽略 s2。

我假设需要创建某种时间(EOF)。

4

1 回答 1

0
scanf("%s %s %s", &op, &s1, &s2);

由于 ,和的类型&op,这条线不能很好地定义。它们被期望为s,但唯一可能发生的方法是 if ,并且声明为:。这意味着您的输入字段最多为零个字符。&s1&s2scanfchar *ops1s2char op, s1, s2;

更有可能是您已经声明了ops1并且s2被声明为:char op[max], s1[max], s2[max];。这意味着和&op的类型。这些指针可能指向同一个地方,但它们不需要具有相同的表示。只是巧合,它们在您的系统上确实具有相同的表示形式。如果您关心可移植性,您将理解数组默默地转换为指针,并使用类似这样的东西:&s1&s2char (*)[max]

/* TODO: Handle errors from scanf! */
assert(scanf("%s %s %s", op, s1, s2) == 3);

scanf将其格式字符串中的空格解释为“尽可能多地读取空白字符”。'\n'算作空格。因此,当您在标准输入中输入“^ A\n”时,scanf已经读取并存储了您的两个单词,并且正在等待第三个。这可以解释为什么它看起来好像你不能忽略第三个。也许您可以阅读其中一个词,然后检查是否op是,然后"^"再决定要检索多少。例如:

/* TODO: Handle errors from scanf! */
assert(scanf("%s", op) == 1);

if (strcmp(op, "^") == 0) {
    assert(scanf("%s", s1) == 1);
    if (strcmp(s1, "A") == 0) {
        matrix_transpose(matA, ArowsPtr, AcolsPtr);
    }
}
else {
    assert(scanf("%s %s", s1, s2) == 2);
    /* TODO: Do something with s1 and s2... */
}
于 2013-04-27T18:07:53.097 回答