Strtok_r()并移动保存指针
Strtok_r() and moving the save pointer
我正在尝试为小型cstrings"&&"answers"||"标记一个字符串。我一直在使用strtok_r()取得了一些不错的成功,但由于对strtok_r()缺乏理解,或者可能对指针的误解,我似乎无法让解析器正常工作。
代码
121 char *cstr3;
122 char* sp;
123 int fc = findclosest(cstr2);
124 switch (fc){
125 case 0:
126 std::cout << "that's it"; //debug
127 cstr3 = strtok_r(cstr2, ";", &sp);
128 break;
129
130 case 1:
131 std::cout << ";"; //debug
132 cstr3 = strtok_r(cstr2, ";", &sp);
133 break;
134
135 case 2:
136 std::cout << "&&"; //debug
137 cstr3 = strtok_r(cstr2, "&", &sp);
138 break;
139
140 case 3:
141 std::cout << "||"; //debug
142 cstr3 = strtok_r(cstr2, "|", &sp);
143 break;
144
145 default:
146 break;
147 }
148
149 puts(cstr3);//debug
150 while(cstr3 != NULL)
151 {
152 char mustfail =0;
153 char mustpass =0;
154
155 int a = fcall(breakitup(cstr3));
156
157 if (a > 0){
158 delete[] cstr;
159 goto skippy;
160 }
161
162 fc = findclosest(cstr3);
163
164 switch (fc){
165 case 0:
166 cstr3 = strtok_r(NULL, ";", &sp);
167 break;
168
169 case 1:
170 std::cout << ";"; //debug
171 cstr3 = strtok_r(NULL, ";", &sp);
172 break;
173
174 case 2:
175 std::cout << "&&"; //debug
176 cstr3 = strtok_r(NULL, "&", &sp );
177 break;
178
179 case 3:
180 std::cout << "||"; //debug
181 cstr3 = strtok_r(NULL, "|", &sp);
182 break;
183
184 default:
185 break;
186 }
187 if (cstr3 != NULL){ //debug
188 puts(cstr3);
189 }
190 }
它不是在下一个命令中不加"&"或"|",而是在STARTING行中加一个。因此,我假设解析器只删除了第一个"&"
为了更好地解释,输出如下(行以'>'开头表示输入)。很抱歉,一些调试语句仍在输出中。
> pwd; ls
;pwd //debug
/folder/folder/folder/project //function works properly
ls //debug
notrshell README.md rshell.cpp shelly supershell
> pwd && ls
&&pwd //debug
/folder/folder/folder/project
& ls //debug
因为那个额外的"&",下一个命令的解释不正确,有没有简单的方法可以跳过那个"&"?
我再次尝试调用完全相同的命令,例如:
176 cstr3 = strtok_r(NULL, "&", &sp );
177 cstr3 = strtok_r(NULL, "&", &sp );
假设它将简单地移除另一个&,但那没用。
我还试着转移指针,偷偷跳过多余的&,
176 cstr3 = 1+ strtok_r(NULL, "&", &sp );
但这不仅很俗气,而且也不起作用。
关于strtok_r()或指针,我能学到些什么吗?
考虑这个输入:pwd && ls
。
在第一个switch
语句中,您生成:
cstr3 = strtok_r(cstr2, "&", &sp);
在该调用之后,cstr3
指向字符串:"pwd "
,如,根据手册:
每次调用strtok()都会返回一个指针,指向一个以null结尾的字符串,该字符串包含下一个令牌。此字符串不包括分隔字节。
sp
指向…嗯,手册并没有从字面上说明它,但它很可能指向它在最后一次调用中完成的位置——在我们的情况下,就在分隔符&
之后。因此,它指向我们字符串的一部分:& ls
。这就是在第二个strtok_r
调用中被标记的内容。
我不能确定,但我猜findclosest
函数有问题——你能确认它在这里返回了正确的值吗?
不管怎样,从手册上看:
delim参数指定一个字节集,用于分隔解析字符串中的标记。
这意味着您应该能够使用"&&"
作为分隔符。这应该能解决问题。
在调用系统函数时,请记住,对于某些(大多数?)shell,命令末尾的单个&
会将其执行置于后台。
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 将对象移动到std::shared_ptr
- 何时在引用或唯一指针上使用移动语义
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 如何从具有移动语义的类对象中生成共享指针
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- C / C++ 移位/偏移/向左或向右移动位图?
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- MSVC将仅移动结构参数解释为指针
- 在C++中将类(带有Vector成员)保存为二进制文件
- 自定义先决条件对移动分配运算符有效吗
- 返回值优化:显式移动还是隐式
- 在'string=string+s1'和"string+=s1"之间移动语义可以保存多少个复制操作?
- QT4 QListView保存图标位置下一次由手动移动
- Strtok_r()并移动保存指针
- 将unique_ptr保存的阵列移动到矢量的阵列存储中
- 移动语义如何保存临时变量的数据