c - 用C字符串中的转义字符双引号替换双引号
问题描述
从向量中获取资源(字符串),稍后对字符串进行一些操作。其中,字符串(资源)之一具有以下值:
"bundle 20B / / <a href="http://ezproxy.rit.edu/login?url=http://firstsearch.oclc.org/fsip?dbname=CWI&done=refer 1234567890123456789012345678901234567890123456789012345678901234567890123456 "
但是,由于这个字符串中有一个 (") 双引号字符(前面没有 \ ;它被视为字符串的结尾,因此在进一步的阶段导致错误。我想编写一个代码,其中,如果在从向量接收到的值中检测到双引号,应将其替换为 (\"),以便不会发生此错误,并且该字符串中所有出现的双引号字符都应执行此过程。
我觉得我的解决方案不是很好。请建议对此代码进行一些更改,以获得更好和优化的解决方案。
for(i = 0; i < vector_getCount(resNames); i++)
{
char *resource = vector_elementAt(resNames, i);
int size = 0;
char str[100];
int i = 0;
while(resource[size] != '\0')
{
if(resource[size] == '\"')
{
str[i] = '\\';
str[i+1] = '\"';
i = i+2;
}
else
{
str[i++] = resource[size];
}
size++;
}
vector_setElementAt(resNames, i, str)
}
在这段代码中,这个漫长的过程将发生在所有向量元素上。但这对性能非常不利。有更好的解决方案吗?
解决方案
我试图编写一个简单的函数,使指定的字符进行转义。你可以玩弄它。
#include <stdio.h>
#include <string.h>
#include <assert.h>
void myEscaper(char const * str_in,
char * str_out,
size_t str_out_size,
char escape_char) {
size_t length_str = strlen(str_in);
assert(length_str < str_out_size);
size_t j = 0;
for (size_t i = 0; i < length_str; ++i) {
if (str_in[i] == escape_char) {
str_out[j] = '\\';
str_out[++j] = str_in[i];
}
else {
str_out[j] = str_in[i];
}
++j;
}
str_out[j] = 0;
}
int main() {
char const * in = "acdavca";
char out[100] = {0};
myEscaper(in, out, sizeof(out), 'a');
// You can call the below one
//myEscaper(in, out, sizeof(out), '\"');
puts(out);
}
推荐阅读
- r - 使用 R 从图像中删除绿屏背景
- c# - IEnumerable.Zip resultsSelector 可以向结果 Enumerable 添加多个元素吗?
- python - 使用python导入带有熊猫的excel
- python - 使用python从嵌套列表中删除空白值
- php - 在命令行上工作时php上的curl连接超时
- docker - Docker 不会;不会在 docker 容器内启动
- azure - 为什么调试后所有数据流都没有出现在权限范围内?
- javascript - 当我将鼠标悬停在地图中的其他区域时,如何显示弹出信息?
- c++ - 错误:AddressSanitizer:地址 0x6020000001d4 在 pc 0x0000003a3e3e bp 0x7fffdafb66c0 sp 0x7fffdafb66b8 上的堆缓冲区溢出
- c# - Expression.Lambda 不绑定 IEnumerable