按下“Enter”键时忽略字符串

时间:2012-11-12 18:31:13

标签: string scanf

我对这行代码有疑问:

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。

我假设需要创建某种类型的while(EOF)。

1 个答案:

答案 0 :(得分:0)

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

由于&op&s1&s2的类型,无法很好地定义此行。 scanf期望它们为char *,但唯一的方法是ops1s2被声明为:{ {1}}。这意味着您的输入字段最多为零个字符。

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

char (*)[max]

/* TODO: Handle errors from scanf! */ assert(scanf("%s %s %s", op, s1, s2) == 3); 将其格式字符串中的空格解释为“尽可能多地读取空白字符”。 scanf被视为空格。因此,当您在stdin中输入“^ A \ n”时,'\n'已经读取并存储了两个,并且正在等待第三个。这可能解释了为什么它看起来好像你不能忽略第三个。也许你可以阅读你的一个单词,然后在决定你想要检索多少之前检查scanf是否op。例如:

"^"