长字符串包含换行符

6
我看到过使用@的C#代码,它告诉编译器字符串中有换行符,但应该放在一行中。C/C++中是否有类似的东西?
例如,如果我想输入以下内容:
73167176531330624919225119674426574742355349194934 96983520312774506326239578318016984801869478851843 85861560789112949495459501737958331952853208805511 12540698747158523863050715693290963295227443043557 66896648950445244523161731856403098711121722383113 62229893423380308135336276614282806444486645238749 30358907296290491560440772390713810515859307960866 70172427121883998797908792274921901699720888093776 65727333001053367881220235421809751254540594752243 52584907711670556013604839586446706324415722155397 53697817977846174064955149290862569321978468622482 83972241375657056057490261407972968652414535100474 82166370484403199890008895243450658541227588666881 16427171479924442928230863465674813919123162824586 17866458359124566529476545682848912883142607690042 24219022671055626321111109370544217506941658960408 07198403850962455444362981230987879927244284909188 84580156166097919133875499200524063689912560717606 05886116467109405077541002256983155200055935729725 71636269561882670428252483600823257530420752963450
在字符串中,我不想把它都放在一行上,只想让编译器知道那是一行。

@AntonioCS,你在做什么工作,需要使用如此大的数字和如此长的字符串?你是在开发某种编译器测试套件吗?只是好奇。 :-) - Onorio Catenacci
3
你在做欧拉计划(Project Euler)啊。 - Skizz
5个回答

18

在本回答初始编写时,C和C++并没有类似C#逐字字符串字面量的功能。最接近的方式是:

"73167176531330624919225119674426574742355349194934"
"96983520312774506326239578318016984801869478851843" 
"85861560789112949495459501737958331952853208805511"  
"12540698747158523863050715693290963295227443043557" 
"66896648950445244523161731856403098711121722383113" 
"62229893423380308135336276614282806444486645238749" 
"30358907296290491560440772390713810515859307960866" 
"70172427121883998797908792274921901699720888093776" 
"65727333001053367881220235421809751254540594752243"  
"52584907711670556013604839586446706324415722155397" 
"53697817977846174064955149290862569321978468622482" 
"83972241375657056057490261407972968652414535100474" 
"82166370484403199890008895243450658541227588666881" 
"16427171479924442928230863465674813919123162824586"  
"17866458359124566529476545682848912883142607690042"
"24219022671055626321111109370544217506941658960408" 
"07198403850962455444362981230987879927244284909188" 
"84580156166097919133875499200524063689912560717606" 
"05886116467109405077541002256983155200055935729725"     
"71636269561882670428252483600823257530420752963450"

需要注意的是,即使在C#中使用这个方法也不会产生你想要的效果。如果你有以下代码:

string foo = @"x
y";

如果使用C#,那么该字符串实际上将包含一个换行符。

在C++11中,根据注释,R前缀表示一个原始字符串字面量(raw string literal),例如:

string x = R"(First line
second line)";

1
“时间飞逝”,好的想法具有感染力。 - Dmitry Ledentsov

9
C和C++具有自动连接相邻引用字符串的功能。这意味着:
const char *a = "a" "b";

并且

const char *b = "ab";

将会使ab指向相同的数据。当然,您可以扩展它,但是如果字符串包含引号,这将变得麻烦。您的示例似乎没有包含引号,所以那时可能更实用。


7
在C和C++中,您可以这样做:
const char* str = "73167176531330624919225119674426574742355349194934"
                  "96983520312774506326239578318016984801869478851843";

编译器会自动将它们连接成一个字符串。


5

另一种选择是在行尾使用 \,预处理器会删除接下来的换行符:

const char *str = "Hello,\
 World!";

如上所述,依靠相邻字符串文本的自动连接看起来并不美观;但是还是应该提及这种方法。


4
当然,您可以这样做:
char *x = "73167176531330624919225119674426574742355349194934\n"
          "96983520312774506326239578318016984801869478851843\n"
                     <lines removed for brevity>
          "71636269561882670428252483600823257530420752963450";

这将完全模拟@""的行为(包括换行符)。

如果您真的希望它成为没有换行符的一行,请不要放置"\n"换行符,但这与C#中@""的工作方式略有不同。


点赞了这个答案,因为它包含了换行符\n - 这似乎是OP想要的。(但我想知道他是否可以没有?) - Aardvark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接