0

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

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
}

我该怎么做才能阅读运营商?

4

4 回答 4

4

与数字转换说明符 和 不同%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好,以及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];&符号再次被删除。然后,您可以自信地将row1和转换row2为数字。

另请参阅:C 中的 Calc 单元格转换器,了解将列号转换为相应字母代码的代码。

于 2013-06-22T03:56:53.187 回答
1

如果我理解这个问题,那么您正在读取两个数字,它们之间只有一个字符。因此,您将使用格式字符串将每个数字读入 an int%d并使用格式字符串将字符读入字符串(char[]数组)%s

int nFirst;
int nSecond;
char op[5];  // operator, null, and some extra space to avoid overflow.

while (sscanf(matrix[i][c] + offset, "%d %s %d",
       &nFirst, op, &nSecond) == 3)

请注意,您必须传递变量的地址intchar[]数组的名称已经解析为地址。

的返回值sscanf应该是 3,因为返回转换的项目数,并且您希望它填充 3 个变量。

于 2013-06-22T03:27:44.737 回答
0

当您给出“%*c”时,表示读取一个字符并忽略它。因此,您忽略了格式字符串中的符号。我认为它按设计工作。你可能需要做这样的事情。

char col, sign;
int line, readCharCount;

sscanf (matris[i][c] + offset, "%c%d%c%n", &col, &line, &sign, &readCharCount);

/* Read count and return value will be 3 */

A1+ 将被阅读。

col = 'A';
line = 1;
sign = '+'
readCharCount = 3;

这是你想要的?

您更改了原始帖子。让我为新要求添加一些内容!

char a1[5], b1[5], sign;
int readCharCount;

sscanf (matris[i][c] + offset, "%s %c %s%n", a1, &sign, b1, &readCharCount);

/* Read count and return value will be 3 */

“A1 + B1”将像这样读取。

a1 = "A1";  // String
sign = '+'  // Character
b1 = "B1";  // String
readCharCount = 3;  // No of items read. Return value will also be 3.

新的输入流是:A1+B1+C1+D1+E2-F3*G1

这是要阅读的代码,假设流以 '\n' 终止:

char c1, c2, c3;

c1 = '\0';
while (c1 != '\n')
{
     scanf("%c%c%c", &c1, &c2, &c3);
     if(c1 != '\n')
     {
          /* Process characters */
     }
}
于 2013-06-22T03:33:26.193 回答
0

I believe Adam's post is correct, but it will encounter problems if there is no space between the + and the operand number that follows it.

With "%d%s%d", the string "1234 +5555" will cause the %s to catch +5555.

I made the following program, and this catches the operands correctly regardless of the existence of spaces. However, the variable string may contain a string with white-spaces. Note that [^0123456789 ] means "match all characters that are not numbers".

int main (int argc, char ** argv) {
    int a, b;
    char string[100];
    scanf ("%d%[^0123456789 ]%d", &a, string, &b);

    printf ("a = %d\n", a);
    printf ("str = %s\n", string);
    printf ("b = %d\n", b);
}

I hope this helps!

于 2013-06-22T04:04:21.313 回答