我正在读取一个字符串,它有两个数字,它们之间有一个算术运算符,比如其中一个:
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
好,以及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
为数字。
另请参阅:C 中的 Calc 单元格转换器,了解将列号转换为相应字母代码的代码。
如果我理解这个问题,那么您正在读取两个数字,它们之间只有一个字符。因此,您将使用格式字符串将每个数字读入 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)
请注意,您必须传递变量的地址,int
但char[]
数组的名称已经解析为地址。
的返回值sscanf
应该是 3,因为返回转换的项目数,并且您希望它填充 3 个变量。
当您给出“%*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 */
}
}
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!