【问题标题】:Defining a string over multiple lines在多行上定义一个字符串
【发布时间】:2012-09-23 13:48:02
【问题描述】:

请采取以下措施:

char buffer[512];

memset(buffer, 0, sizeof(buffer));
sprintf(&buffer[0],"This Is The Longest String In the World that in text goes on and..");

printf("Buffer:%s\r\n",buffer);

我希望能够在多行中创建此字符串,以便于故障排除和编辑。但是,当我使用 \ 命令时,我的输出会被标签分隔?

例子:

sprintf(&buffer[0],"This Is The\
    Longest String In the World\
    that in text goes on and..");

产生以下输出:

Buffer:This Is The        Longest String In the World       that in text goes on and..

有什么想法吗?这只是尝试在多行代码中分解字符串的错误方法吗?

【问题讨论】:

标签: c syntax


【解决方案1】:

换行符继续考虑代码中的任何空格。

您可以利用字符串文字连接以获得更好的可读性:

sprintf(buffer, "This Is The "
                "Longest String In the World "
                "that in text goes on and..");

使用\,您需要在第 0 列开始继续您的字符串:

sprintf(buffer, "This Is The \
Longest String In the World \
that in text goes on and..");

【讨论】:

  • 额头被打了一巴掌。自动标签让我陷入困境!感谢您指出这一点,这确实是问题所在。
【解决方案2】:

这也可以:

char buffer[512];
sprintf(&buffer[0], "This is the longest string"
        "in the world that in text"
        "goes on and on and on and on ....");
printf("%s\n", buffer);

【讨论】:

    【解决方案3】:

    虽然这可能看起来很迂腐,但我在现实世界中已经被咬了足够多的时间,以至于其他两个发布的答案存在以下问题。

    • 发布的两个答案忽略了在加入的单词之间留出空格 单独的字符串文字(很明显,在第一次测试之后)。

    • 如果你的字符串真的很长,请改用snprintf()——它有点长 笨拙,但它告诉任何审查您的代码的人您知道 代码维护中的常见危险。

    • 如果您的字符串恰好包含%,您将收到编译器警告 (好)或随机分段错误(坏)。所以使用"%s" 或者,也许在 在这种情况下,只需strcpy().(两个月后,同事可以轻松地将99.9% 添加到消息中。)

    • 我经常看到的memset(),的使用只是货物崇拜 编程。是的,在特殊情况下需要它,但使用 它总是发送错误的信息。

    • 最后,为什么有人会使用&buffer[0] 而只是buffer 会做吗?

    总而言之,你的代码应该是这样的:

    char buffer[512];
    snprintf(buffer, sizeof buffer, "%s", 
       "This is The Longest String "
       "In the World that in text "
       "goes on and on and on and on ....");
    printf("Buffer:%s\r\n", buffer);
    

    【讨论】:

    • 这些都是非常好的点。感谢您花时间制作它们。上面的代码实际上只是我正在处理的一个示例,但是您在此处列出的所有要点都非常有效。并回答你的最后一个问题:我不是一个优雅的程序员,所以经常依赖蛮力。 >
    • @JosephQuinsey 我认为没有必要,尽管您确实提请我注意我的回答中的缺陷。这个网站的目标是好的问题和答案,每个人都必须坚持自己的优点,即使这意味着综合其他答案的有用片段,而且我经常不@引用其他用户。话虽如此,您的评论对我也很有用,我深表歉意。
    • @pb2q:感谢您非常优雅的回复。
    • 同意前4点,但我认为&x[0]不是缺陷,它清楚地说明了发生了什么。
    猜你喜欢
    • 2021-10-25
    • 2011-10-02
    • 1970-01-01
    • 2011-12-05
    • 2010-10-14
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多