C++读取Linux终端SocketCAN candump输出并与指定字符串比对
匹配SocketCAN candump输出格式的解决方案
看来你已经搞定了SocketCAN初始化和读取candump输出到result变量这一步,接下来只需要把这个变量和你指定的格式字符串做比对就行啦。我给你两种实用的实现思路:
1. 精确字符串匹配
既然你手动执行candump时的输出格式是固定的(can0 71A [1] 7F,严格对应你说的空格数量),直接做精确相等判断是最直接的方式。以Python为例:
# 定义目标格式的字符串(严格对应空格数量) target_output = "can0 71A [1] 7F" # 先去除result首尾可能带的换行/空格,再比对 if result.strip() == target_output: print("输出格式匹配成功!") else: print(f"输出不匹配,当前内容:{repr(result)}")
如果是用C++实现,逻辑类似:
#include <string> #include <iostream> int main() { std::string result = "..."; // 你读取到的candump输出 std::string target = "can0 71A [1] 7F"; // 去除首尾空白字符 size_t start = result.find_first_not_of(" \n\r\t"); size_t end = result.find_last_not_of(" \n\r\t"); std::string trimmed_result = result.substr(start, end - start + 1); if (trimmed_result == target) { std::cout << "匹配成功!" << std::endl; } else { std::cout << "匹配失败,当前输出:" << trimmed_result << std::endl; } return 0; }
2. 正则表达式匹配(鲁棒性更强)
如果担心某些场景下candump的空格数可能有细微变化(比如终端环境差异导致的空格/制表符替换),用正则表达式匹配会更灵活。还是以Python为例:
import re # 正则规则:匹配can0后接任意数量空白,然后71A,任意空白,[1],任意空白,7F match_pattern = r"can0\s+71A\s+\[1\]\s+7F" # 用fullmatch确保整个字符串完全符合规则 if re.fullmatch(match_pattern, result.strip()): print("输出格式匹配成功!") else: print(f"输出不匹配,当前内容:{repr(result)}")
这个规则会忽略各段之间的空白数量,只要是空白字符(空格、制表符等)都能匹配,适合可能存在格式波动的场景。
内容的提问来源于stack exchange,提问作者MertensToon
相关产品推荐
相关产品推荐

