我正在读取一个字符串,该字符串包含两个数字,它们之间有一个算术运算符,例如其中一个:
A1 + B1
A1 - B1
A1 * B1
A1 / B1
我能看懂 A1 和 B1,但看不懂接线员。我正在阅读:
while (sscanf(matrix[i][c] + offset, "%c%d%*c%n",
&col, &line, &readCharCount) == 2) {
// do something
}
如何读取操作符?
最佳答案
与数字转换说明符和 %s
不同,%c
转换说明符不会跳过空格。因此,给定您的示例输入, %*c
正在读取运算符之前的空白。你可以明智地使用:
while (sscanf(matrix[i][c] + offset, " %c%d %c %c%d", &col1, &row1, &op, &col2, &row2) == 5)
...data is OK...
由于您正在使用偏移量并捕获扫描结束的位置,因此您将使用:
while (sscanf(matrix[i][c] + offset, " %c%d %c %c%d%n",
&col1, &row1, &op, &col2, &row2, &readCharCount) == 5)
...data is OK...
请注意,%n
转换说明符不计算在内,因此测试仍然针对 5,而不是 6。
另请注意在格式字符串中小心放置空格。它们是必要且灵活的(可以处理 A1+B2
OK,以及 A1 + B2
)。如果您要允许更大的电子表格,您可能更愿意指定:
while (sscanf(matrix[i][c] + offset, " %4[a-zA-Z]%d %c %4[a-zA-Z]%d%n",
col1, &row1, &op, col2, &row2, &readCharCount) == 5)
...data is OK...
其中 col1
和 col2
的类型从单个更改为 char col1[5]; char col2[5];
(这也是 &
也被删除的原因)。扫描集允许识别像 aAa1 + BbB2
这样的输入。由于 %d
表示法,字母或字母与数字之间允许有空格(因此代码将允许 aaa 999 + bbb 888
。避免这种情况很难;我认为您需要使用两个扫描集处理数据:
while (sscanf(matrix[i][c] + offset, " %4[a-zA-Z]%5[0-9] %c %4[a-zA-Z]%5[0-9]%n",
col1, row1, &op, col2, row2, &readCharCount) == 5)
...data is OK...
现在的类型是 char row1[6]; char row2[6];
并且符号再次被删除。然后,您可以放心地将 row1
和 row2
转换为数字。
另请参阅:Calc cell convertor in C用于将列号转换为相应字母代码的代码。
关于C - 使用 sscanf 读取算术运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17246910/