这段代码有什么问题?我总是收到丢失终止 '"' 错误。我是 C 新手,希望使用此 ASCII 来提交 CS50x

Cyr*_*rix 1 c string-literals rawstring cs50

我的程序根本不起作用。我收到这个错误。

population/ $ make test
test.c:6:9: error: missing terminating '"' character [-Werror,-Winvalid-pp-token]
printf(R"EOF(
        ^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
2 errors generated.
Run Code Online (Sandbox Code Playgroud)
#include <stdio.h>
#include <cs50.h>

int main(void)
{
printf(R"EOF(
   _____       _               _ _   _           _   _              _____           _
  / ____|     | |             (_) | | |         | | | |            / ____|         (_)
 | (___  _   _| |__  _ __ ___  _| |_| |_ ___  __| | | |__  _   _  | |    _   _ _ __ ___  __
  \___ \| | | | '_ \| '_ ` _ \| | __| __/ _ \/ _` | | '_ \| | | | | |   | | | | '__| \ \/ /
  ____) | |_| | |_) | | | | | | | |_| ||  __/ (_| | | |_) | |_| | | |___| |_| | |  | |>  <
 |_____/ \__,_|_.__/|_| |_| |_|_|\__|\__\___|\__,_| |_.__/ \__, |  \_____\__, |_|  |_/_/\_\
                                                            __/ |         __/ |
                                                           |___/         |___/
)EOF");
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*ris 6

C 中的字符串文字不能跨越多行,除非换行符被转义。

但是,相邻的字符串文字会自动连接,因此以下方法有效:

const char *foo = "foo\n" "bar\n" "baz";
Run Code Online (Sandbox Code Playgroud)

由于字符串文字之间的空格无关紧要,因此我们可以编写以下内容:

const char *foo = 
    "foo\n"
    "bar\n"
    "baz";
Run Code Online (Sandbox Code Playgroud)

对比。

const char *foo = "foo
bar
baz";
Run Code Online (Sandbox Code Playgroud)

正如评论中提到的,您可以使用反斜杠转义换行符。但是,在这种情况下,您仍然必须记住手动插入换行符。

const char *foo = "foo\n\
bar\n\
baz";
Run Code Online (Sandbox Code Playgroud)

我不喜欢这个,因为它可以防止代码缩进,这对于能够遵循控制流和范围非常重要。