C - 使用 sscanf 读取算术运算符

标签 c math

我正在读取一个字符串,该字符串包含两个数字,它们之间有一个算术运算符,例如其中一个:

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...

其中 col1col2 的类型从单个更改为 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]; 并且符号再次被删除。然后,您可以放心地将 row1row2 转换为数字。

另请参阅:Calc cell convertor in C用于将列号转换为相应字母代码的代码。

关于C - 使用 sscanf 读取算术运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17246910/

相关文章:

c - C进程在fork()之后打印两次,即使它在父进程内部并且我刷新了stdout

math - 有没有一种更优雅的方法来计算x =(y/n)+(y%n?1 : 0) ?

r - geom_text 中的数学符号错误

c - 如何使用#define语句

c - 二维数组作为一维指针数组

c - 操作数组导致段错误?

java - 在java中使用正则表达式进行数学表达式?

matlab - Matlab 中使用随机梯度下降进行矩阵分解

python - 如何将值传递给公式?

c - 为什么先调用shm_unlink再调用shm_open?