gpt4 book ai didi

c++ - 为什么我会得到这个奇怪的角色?

转载 作者:太空狗 更新时间:2023-10-29 20:02:26 24 4
gpt4 key购买 nike

为什么我的 C++ 程序会创建如下图所示的奇怪字符?左边黑色背景的图片来自终端。右边白色背景的图片来自输出文件。以前,它是一个“\v”,现在它变成了某种占星符号或符号来表示男性。 0_o 这对我来说毫无意义。我错过了什么?我怎样才能让我的程序只输出一个反斜杠 v?

enter image description here enter image description here

请看下面我的代码:

// SplitActivitiesFoo.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <fstream>

using namespace std;

int main()
{
string s = "foo:bar-this-is-more_text@\venus \"some more text here to read.\"";
vector<string> first_part;
fstream outfile;
outfile.open("out.foobar");

for (int i = 0; i < s.size(); ++i){

cout << "s[" << i << "]: " << s[i] << endl;
outfile << s[i] << endl;
}



return 0;
}

此外,假设我不想在这种情况下修改我的字符串“s”。我希望能够解析字符串的每个字符并以某种方式解决奇怪的字符。这是因为在实际程序中,字符串将从文件中读取并解析然后发送到另一个函数。我想我可以找到一种以编程方式添加反斜杠的方法...

最佳答案

How can I have my program output just a backslash v?

如果你想要一个反斜杠,那么你需要转义它:"@\\venus"

这是必需的,因为反斜杠表示下一个字符应该被解释为特殊的东西(请注意,当您需要双引号时,您已经使用了它)。因此,除非您告诉编译器,否则编译器无法知道您实际上想要反斜杠。

因此,文字反斜杠字符的语法为 \\。字符串文字 ("\\") 和字 rune 字 ('\\') 都是这种情况。

Why does my C++ program create the strange character shown below in the picture?

您的字符串包含 \v 控制字符(垂直制表符),它的显示方式取决于您的终端和字体。看起来您的终端正在使用来自传统 MSDOS 代码页的符号。

我为您找到了一张图片 here ,它准确显示了值 11 (0x0b) 处垂直制表符 (vt) 条目的符号:

ASCII table

Also, assume that I do not want to modify my string 's' in this case. I want to be able to parse each character of the string and work around the strange character somehow.

好吧,我刚刚看到您将以上部分添加到您的问题中。现在你处在困难的境地。因为您的字符串文字实际上并不包含字符 v 或任何反斜杠。它只在代码中以这种方式出现。如前所述,编译器已经解释了这些字符并为您替换了它们。

如果出于某些疯狂的原因(希望与 XY 问题无关)而坚持打印 v 而不是垂直制表符,那么您可以为每个字符构建一个查找表,然后替换不需要的字符与其他东西:

char lookup[256];
std::iota( lookup, lookup + 256, 0 ); // Using iota from <numeric>
lookup['\v'] = 'v';

for (int i = 0; i < s.size(); ++i)
{
cout << "s[" << i << "]: " << lookup[s[i]] << endl;
outfile << lookup[s[i]] << endl;
}

现在,这不会打印反斜杠。要撤消字符串,请进一步查看 std::iscntrl .它取决于语言环境,但您可以利用它。或者只是像这样天真的东西:

const char *lookup[256] = { 0 };
s['\f'] = "\\f";
s['\n'] = "\\n";
s['\r'] = "\\r";
s['\t'] = "\\t";
s['\v'] = "\\v";
s['\"'] = "\\\"";
// Maybe add other controls such as 0x0E => "\\x0e" ...

for (int i = 0; i < s.size(); ++i)
{
const char * x = lookup[s[i]];
if( x ) {
cout << "s[" << i << "]: " << x << endl;
outfile << x << endl;
} else {
cout << "s[" << i << "]: " << s[i] << endl;
outfile << s[i] << endl;
}
}

请注意,没有办法正确地重建最初出现在代码中的转义字符串,因为有多种方法可以转义字符。包括普通字符。

关于c++ - 为什么我会得到这个奇怪的角色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41132328/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com