C语言中如何将分离出来的一个个字符串数组和字符串类型,存进结构体数组中,给出测试代码
时间: 2024-10-09 13:00:49 浏览: 40
柔性数组成员
在C语言中,将字符串和对应的类型(如"INTEGER"、"REAL"、"IDENTIFIER"等)存入结构体数组中,可以使用自定义的结构体来表示这些信息。以下是一个简单的示例,展示了如何创建这样的结构体以及相应的测试代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h> // 用于操作字符串
// 定义结构体,用于存储字符串和类型
typedef struct {
char* string;
char* type;
} StringDatum;
// 助手函数,用于创建并初始化结构体实例
StringDatum create_string_data(char* str, char* type) {
StringDatum data;
data.string = strdup(str); // 使用strdup复制字符串,防止原始数据改变影响结果
data.type = strdup(type);
return data;
}
// 主函数进行字符串和类型的组合
void store_in_array(const char* source_code, StringDatum* array, size_t max_elements) {
size_t i = 0;
char* token = strtok(source_code, " \t\n"); // 分割字符串,这里仅按空格划分
while (token != NULL && i < max_elements) {
StringDatum datum = create_string_data(token, classify(token)); // 根据字符串内容获取类型
array[i] = datum;
token = strtok(NULL, " \t\n");
++i;
}
if (i == max_elements) {
printf("警告:已达到最大元素数!\n");
}
}
// 类型分类函数,简化版,这里仅做简单判断
char* classify(char* str) {
if (isdigit(*str)) return "INTEGER";
else if (strchr("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", *str) != NULL) return "IDENTIFIER"; // 假设非数字字母开头的是标识符
else if (strchr(".eE", *str) != NULL) return "REAL"; // 假设带点的可能是浮点数
else return "OTHER"; // 其他情况,如关键词或运算符
}
int main() {
char source_code[] = "int main() {\n"
" int x1, x2, y;\n"
" x1 = 34;\n"
" x2 = 56.78;\n"
" y = x1 + x2 * 3;\n"
"}";
StringDatum data_array[10]; // 假设最多处理10条数据
store_in_array(source_code, data_array, sizeof(data_array) / sizeof(data_array[0]));
// 打印存储的结果
for (size_t i = 0; i < i; ++i) {
printf("String: %s Type: %s\n", data_array[i].string, data_array[i].type);
free(data_array[i].string); // 清理内存
free(data_array[i].type);
}
return 0;
}
```
这个例子中,`store_in_array`函数将输入代码中的每个有效字符串和其类型分别放入`StringDatum`结构体数组中。记住,这只是一个基础示例,实际的词法分析需要更复杂,比如处理关键字、处理多行字符串和括号内的表达式等。
阅读全文