我刚刚学习 C++,正在尝试编写一个程序,该程序将从 char* argv[]
获取输入并处理它们。
每个 argv[]
都是 6 个十六进制数,例如1A2B3C
我有一个 char
数组
- 字符消息[3]
我正在尝试将 1A
放入 message[0]
,将 2B
放入 message[1]
和 3C
到 message[2]
。
我知道 argv
有点像二维数组,所以如果我的命令行是:
./test 2 1A2B3C 4D5E6F
argv[2][0]
会给我“1”,argv[2][1]
会给我“A”
但我不知道如何将2个char
一起读入char
数组。
谁能指出我正确的方向?
最佳答案
如果主函数是这样声明的
int main(int argc, char *argv[])
打电话
./测试 1A2B3C 4D5E6F
将产生一个看起来类似于
的argv数组- argc是argv中的条目数
- argv 是一个字符串数组(实际上是一个 Pointer to the first element of an array of pointers to null-terminated multibyte strings )
在参数中
- 第一个条目总是路径和可执行文件名,例如"/home/user/test"(为简单起见,图片只显示test)
- 其余条目是命令行参数(在本例中为“1A2B3C”和“4D5E6F”)。
- argv 中的每个条目依次是一个字符数组
举个例子
- argv[1] = ['1','A','2','B','3','C','\0']
从参数中提取子字符串
- 将每个参数转换为字符串 (std::string s(argv[1]) 使用字符串比使用 char* 更容易
- 提取子串(s.substr(0,2))
- 将每个子字符串转换为整数(strtol(substring,NULL,16))
试试这个示例代码
#include <iostream>
#include <stdlib.h> //required for string to int conversion
int main(int argc, char *argv[]) {
std::cout << "executable= " << argv[0] << std::endl;
for (int i=1; i<argc; i++) {
std::string s(argv[i]); //put char array into a string
std::cout << "arg["<<i<<"]="<<s<<std::endl;
for (int j=0; j<6; j+=2) {
std::string byteString = s.substr(j, 2);
char byte = (char) strtol(byteString.c_str(), NULL, 16);
std::cout << "byteString= "<<byteString << " as integer= "<<(int)byte<<std::endl;
}
}
}
调用“./test 1A2B3C 4D5E6F”输出
executable= /home/user/test
arg[1]=1A2B3C
byteString= 1A as integer= 26
byteString= 2B as integer= 43
byteString= 3C as integer= 60
arg[2]=4D5E6F
byteString= 4D as integer= 77
byteString= 5E as integer= 94
byteString= 6F as integer= 111
或者,如果命令行参数已经可以拆分,即
"./test 1A 2B 3C 4D 5E 6F"
可以避免子串提取。
关于C++ 从 char* argv[] 读取输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39472161/