我对这行代码有疑问:
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)。
答案 0 :(得分:0)
scanf("%s %s %s", &op, &s1, &s2);
由于&op
,&s1
和&s2
的类型,无法很好地定义此行。 scanf
期望它们为char *
,但唯一的方法是op
,s1
和s2
被声明为:{ {1}}。这意味着您的输入字段最多为零个字符。
更有可能的是,您宣布char op, s1, s2;
,op
和s1
被声明为: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
。例如:
"^"