我尝试将我的数据存储在双 * 数组中。
double* parse_string(char *string)
...
double *parsed_string = parse_string(str);
我想存储像 124.1546 这样的数字和像“+”这样的运算符。问题是:当这些数据在数组中时,我无法检测到哪个是数字,哪个是运算符。 我试过 isdigit() 和 isalpha(),但只适用于 char *array。 我应该以其他方式存储数据吗?
UPD:我尝试制作逆波兰符号。为此,我使用 fgets 从标准输入获取字符串,然后使用此函数解析该字符串:
double* parse_string(char *string)
{
char result_digits[50][50];
char result_operators[50];
static double result_string[100];
int i = 0;
int digits_cnt = 0;
int digit_string = 0;
int operators_cnt = 0;
while (string[i] != '\n') {
if (detect_symbol_type(string[i]) == sym_digit || string[i] == '.') {
result_digits[digit_string][digits_cnt] = string[i];
digits_cnt++;
} else {
if (detect_symbol_type(string[i]) == sym_operator) {
result_operators[operators_cnt] = string[i];
result_digits[digit_string][digits_cnt] = '\n';
operators_cnt++;
digit_string++;
digits_cnt = 0;
}
}
i++;
}
result_operators[operators_cnt] = '\n';
double result_numbers[100];
for (int i = 0; i <= digit_string; i++) {
double result = 0;
sscanf(result_digits[i], "%lf", &result);
result_numbers[i] = result;
printf("Parse result: %lf\n", result);
}
int k = 0;
for (int i = 0; i <= (digit_string + operators_cnt); i++) {
result_string[i] = result_numbers[k];
printf("%lf", result_string[i]);
i++;
result_string[i] = result_operators[k];
printf("%c", (char)result_string[i]);
k++;
}
return result_string;
}
所以我可以接收包含所有数字和运算符的双数组或分别接收两个数组。我开始认为在我的情况下两个数组并不是一个坏主意......
最佳答案
在电脑上:
- 数字存储为位 (001110101010101110001)
- 字符/运算符存储为位 (000011101111010101101)
没有固有属性可以将一个与另一个区分开来。作为程序员,您 指定应如何解释给定数据。如果您丢失了该信息,例如通过将数字和字符一起存储在同一位置,无法恢复。
然而,您可以做的是将该信息(应如何解释数据)明确地存储在一个单独的位值中。一个典型的低级结构是 union 和标志:
typedef enum {
Number,
Operator,
SomethingElse,
...
} MyDataType;
typedef struct {
MyDataType type;
union {
double number;
char op;
};
} MyData;
现在,如果您有一个类型为 MyData
的对象,比如 x
,您可以通过访问来检查它是什么:
x.type
当你设置它的值时,你需要设置新的类型和适当的字段。例如,分配一个看起来像这样的数字:
x.type = Number;
x.number = 124.1546
如果您喜欢使用 C++ 进行面向对象的编程,那么可以使用访问成员来隐藏这种有点麻烦的机制。
关于c - 如何检查双*数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21678186/