首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在字符串中使用\作为文字,而不是转义

在字符串中使用\作为文字,而不是转义
EN

Stack Overflow用户
提问于 2012-08-24 05:11:27
回答 2查看 75.9K关注 0票数 10
代码语言:javascript
运行
AI代码解释
复制
bool stringMatch(const char *expr, const char *str) {   
    // do something to compare *(expr+i) == '\\'  
    // In this case it is comparing against a backslash
    // i is some integer
}

int main() {
    string a = "a\sb";
    string b = "a b";
    cout << stringMatch(a.c_str(), b.c_str()) << endl;
    return 1;
}

所以现在的问题是: Xcode没有读取'\',当我在stringMatch函数中调试时,expr看起来只是'asb‘而不是文字a\sb’。

Xcode在行中发出警告: string a= "a\sb“:未知转义序列

编辑:我已经尝试使用"a\sb",它读入为"a\sb“作为文字。

EN

回答 2

Stack Overflow用户

发布于 2012-08-24 05:19:21

代码语言:javascript
运行
AI代码解释
复制
bool stringMatch(const char *expr, const char *str) {   
   // do something to compare *(expr+i) == '\\'  
   // In this case it is comparing against a backslash
   // i is some integer
}

int main() {
    string a = "a\\sb";
    string b = "a b";
    cout << stringMatch(a.c_str(), b.c_str()) << endl;
    return 1;
}

默认情况下,C和C++将反斜杠作为转义序列处理。你必须告诉C不要使用反斜杠作为转义序列,方法是在字符串中添加一个额外的反斜杠。

以下是常见的转义序列:

  • \a -Bell(嘟嘟声)
  • \b- Backspace
  • \f - Formfeed
  • \n -换行符<

>H110\r-回车

  • \t-水平制表符
  • \-反斜杠
  • \‘-单引号
  • \“-双引号
  • \o00-八进制Representation
  • \xdd -十六进制Representaion

编辑: Xcode在您的机器上运行异常。所以我可以建议你这样做。

代码语言:javascript
运行
AI代码解释
复制
bool stringMatch(const char *expr, const char *str) {   
   // do something to compare *(expr+i) == '\\'  
   // In this case it is comparing against a backslash
   // i is some integer
}

int main() {
    string a = "a" "\x5C" "sb";
    string b = "a b";
    cout << stringMatch(a.c_str(), b.c_str()) << endl;
    return 1;
}

不用担心string a声明中的空格,Xcode会将字符串用空格分隔。

编辑2:确实是从字面上读取你的"a\\b",这就是它处理转义反斜杠的方式。当您将string a = "a\\sb"输出到控制台时,您将看到a\sb。但是当你将string a作为参数或私有成员在方法之间传递时,它将直接使用额外的反斜杠。你必须考虑到这个事实来设计你的代码,这样它就会忽略额外的反斜杠。如何处理字符串由您决定。

EDIT 3: Edit 1是您在这里的最佳答案,但这里还有另一个答案。

stringMatch()方法中添加代码,将双反斜杠替换为单反斜杠。

您只需在函数的最开始添加以下行:

代码语言:javascript
运行
AI代码解释
复制
expr=[expr stringByReplacingOccurrencesOfString:@"\\\\" withString:@"\\"];

这应该可以解决双反斜杠问题。

EDIT 4:有些人认为Edit 3是ObjectiveC,因此不是最优的,所以在ObjectiveC++中有另一个选择。

代码语言:javascript
运行
AI代码解释
复制
void searchAndReplace(std::string& value, std::string const& search,std::string const& replace)
{
    std::string::size_type  next;

    for(next = value.find(search);        // Try and find the first match
        next != std::string::npos;        // next is npos if nothing was found
        next = value.find(search,next)    // search for the next match starting after
                                          // the last match that was found.
       )
    {
        // Inside the loop. So we found a match.
        value.replace(next,search.length(),replace);   // Do the replacement.
        next += replace.length();                      // Move to just after the replace
                                                       // This is the point were we start
                                                       // the next search from. 
    }
}

5:如果你把stringMatch()中的字符串改为‘const char *’,对你来说就不那么复杂了。

代码语言:javascript
运行
AI代码解释
复制
expr.replace(/*size_t*/ pos1, /*size_t*/ n1, /*const string&*/ str );

EDIT 6:从C++11开始,就存在像raw string literals这样的东西。这意味着您不必转义,相反,您可以编写以下代码:

代码语言:javascript
运行
AI代码解释
复制
string a = R"raw(a\sb)raw";

请注意,字符串中的raw可以由您选择的任何分隔符替换。这适用于您希望在实际字符串中使用像)raw这样的子字符串的情况。当您必须大量转义字符时,使用这些原始字符串字面量主要是有意义的,比如结合使用std::regex

附言:你现在已经有了所有的答案,所以哪一个能给你带来最好的结果取决于你自己。

票数 20
EN

Stack Overflow用户

发布于 2012-08-24 05:14:07

Xcode之所以发出这个警告,是因为它将"a\sb“中的\s解释为转义序列,但\s不是有效的转义序列。它被替换为s,因此字符串变成了"asb“。

"a\\sb"这样转义反斜杠是正确的解决方案。如果这个方法对你不起作用,请发布更多的细节。

下面是一个例子。

代码语言:javascript
运行
AI代码解释
复制
#include <iostream>
#include <string>

int main() {
    std::string a = "a\\sb";
    std::cout << a.size() << ' ' << a << '\n';
}

此程序的输出如下所示:

如果你得到了不同的输出,请发布它。另外,请准确地发布您在之前尝试"a\sb“时观察到的问题。

正则表达式在C++中可能很麻烦,因为反斜杠必须以这种方式进行转义。C++11的原始字符串不允许任何类型的转义,因此转义反斜杠是不必要的:R"(a\sb)"

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12103445

复制
相关文章
套接字
版权声明:本文为博主原创文章,转载请注明博客地址: https://blog.csdn.net/zy010101/article/details/88673990
zy010101
2019/05/25
1.3K0
套接字选项
选项影响套接字操作,如 封包路由,OOB数据传输,获取和设置套接字选项分别是 getsockopt  setsockopt 用法如下: int getsockopt(SOCKET s,int level,int optname,char* optval,int* optlen); int setsockopt(SOCKET s,int level,int optname,char* optval,int* optlen); 每个协议层套接字的选项有不同的级别: 应用层:SOL_SOCKET 传输层:IPPR
用户1154259
2018/01/17
1.3K0
Socket(套接字)
TCP/IP只是一个协议栈,Socket的出现只是可以更方便的使用TCP/IP协议栈而已,其对TCP/IP进行了抽象,形成了几个最基本的函数接口。比如create,listen,accept,connect,read和write等等。
老马的编程之旅
2022/06/22
1.3K0
Python套接字
Python只支持AF_UNIX(基于文件)、AF_NETLINK(使用标准的BSD套接字接口进行用户级别和内核级别代码之间的IPC)、AF_TIPC(透明的进程间通信)、AF_INET(基于网络)家族。
用户4845306
2019/03/14
1.6K0
Java套接字
  本文补充一下Java关于套接字方面的内容,因为其应用相对比较简单,所以下面介绍两个程序实例。
云海谷天
2022/08/09
8120
Java套接字
16(套接字)
套接字描述符在Unix系统中是用文件描述符实现的。事实上,许多处理文件描述符函数(read和write)都可以处理文件描述符 要创建一个套接字,可以调用socket函数
提莫队长
2019/02/21
1K0
套接字Socket编程
Socket,原意插座、插口。写软件程序时,可以想象成一根网线,一头插在客户端,一头插在服务端,然后进行通信。所以通信前,双方都要建立一个Socket。
JavaEdge
2021/12/07
1.3K0
套接字Socket编程
Socket 套接字协议
A network socket is an internal endpoint for sending or receiving data within a node on a computer network. Concretely, it is a representation of this endpoint in networking software (protocol stack), such as an entry in a table (listing communication protocol, destination, status, etc.), and is a form of system resource.
vanguard
2020/03/18
1.5K0
IPC|网络套接字
为了访问由UDP提供的服务,你需要像以前一样使用套接字和close系统调用,但你需要用两个
heidsoft
2022/04/18
1.1K0
套接字随笔1
accept函数接受一个客户端请求后会返回一个新的SOCKFD值,当有不同的客户端同时有不同请求时,会返回不同的SOCKFD的值。这个不同的值和建立SOCKET 时生成的SOCKFD还是不同的。服务器与客户端之间的通信就是在这些不同的SOCKFD上进行的。
随心助手
2022/11/30
5690
linux 网络套接字
在内核分析网络分组时,底层协议的数据将传输到跟高的层。而发送数据的时候顺序是相反的。每一层都是通过加(首部+净荷)传向跟底层,直至最终发送。
233333
2019/05/25
2.8K0
Socket - 套接字编程
目录 Socket - 套接字编程 Socket 通信流程图 Socket模块 socket()方法 部分参数 bind()方法 listen()方法 accept()方法 accept()函数返回值:sock、addr connect() 方法 close()方法 服务端客户端对比 简单案例 简易通信循环 优化通信循环 黏包问题 Struct 模块 规定报头 解决黏包问题 上传文件案例 UDP通信 Socket - 套接字编程 只要涉及到远程数据交互必须要操作OSI七层模型,那么每层都需要相应的程序
HammerZe
2022/03/25
1.1K0
Socket - 套接字编程
套接字Socket编程
Socket,原意插座、插口。写软件程序时,可以想象成一根网线,一头插在客户端,一头插在服务端,然后进行通信。所以通信前,双方都要建立一个Socket。
JavaEdge
2021/10/18
1.4K0
Python与套接字
服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客 户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时 客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应 数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束
星陨1357
2023/03/14
2.4K0
Python与套接字
accept()返回的套接字绑定哪个端口 新旧套接字的联系
摘要:对于服务器编程中最重要的一步等待并接受客户的连接,那么这一步在编程中如何完成,accept函数就是完成这一步的。它从内核中取出已经建立的客户连接,然后把这个已经建立的连接返回给用户程序,此时用户程序就可以与自己的客户进行点到点的通信了。
bear_fish
2018/09/20
4K1
python UDP套接字通信
UDPserver.py 1 import socket 2 #导入套接字模块 3 4 s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 5 # - socket.AF_INET:IPV4 6 # - socket.STREAM:TCP 7 # - socket.DGRAM:UDP 8 9 s.bind(('',25555)) 10 #绑定套接字有效地址和端口 11 #''空位任何地址 本地的127.0.0.1 和局域网还有自己真实
py3study
2020/01/19
1.6K0
什么是socket套接字?
互联网已经深入我们生活的方方面面,重要性不言而喻。上世纪70年代互联网刚发明的时候,就确定了客户端-服务器模型,这个编程模型一直沿用到现在都没有变过,我们在电脑上打开一个网站,在微信上聊天,打开一个app本质上都是客户端和服务器的连接和交互。
zhanyd
2022/05/16
5990
什么是socket套接字?
套接字连接状态检测
主动断开连接 主动断开连接会发送,关闭事件 connec函数检测连接状态,getlasterror send发送(tcp keeplive心跳包或者有数据时检测),recv接收判断异常(无数据判断异常) linux中的 select(socket用户和内核传递数组,大小有限制) poll(同select大小无限制,链表维护) epoll(内核态数据) 拔网线 拔网线后,关闭事件不能传递,连接状态不好检测 设置连接或者发送超时,同步套接字超时设置 // platform-specific switch #i
sofu456
2021/12/06
1K0
Socket套接字通信原理
       Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议.
业余草
2019/01/21
8970
Socket套接字通信原理
基于udp的套接字
1 ss = socket() #创建一个服务器的套接字 2 ss.bind() #绑定服务器套接字 3 inf_loop: #服务器无限循环 4 cs = ss.recvfrom()/ss.sendto() # 对话(接收与发送) 5 ss.close() # 关闭服务器套接字 udp客户端 cs = socket() # 创建客户套接字 comm_loop: # 通讯循环 cs.sendto()/c
超蛋lhy
2018/08/31
8350

相似问题

用haskell编写递归inRange函数

22

如何在haskell中编写递归函数

21

如何编写这个递归的Haskell函数?

11

在模板Haskell中定义递归函数

18

如何编写可变模板递归函数?

63
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档