什么字符在c中特别?

时间:2014-02-23 22:03:35

标签: c

嘿伙计,所以我有这个特殊字符的文字,我想要“逃避”特殊字符,以便能够编译我的程序,但我不知道是/: - =特殊字符?我是否也需要逃避它们?这是示例

static const char *postthis="text and spec chars";

以下是我想放入的文字示例

<text:Text
text:text="http://text.text.text/text/text/"
text:text="text:text:text-text-text">
<text:Text>
<text text="http://text.com/text">
<productID>20630175</textID>
</text>
</text:text>
</text:text>

所以我把\之前&lt;并且“但我又得到了错误,我需要逃脱什么以及如何逃避?

static const char *postthis="\<text:Text
text:text=\"http://text.text.text/text/text/\"
text:text=\"text:text:text-text-text\"\>
\<text:Text\>
\<text text="http://text.com/text\"\>
\<textID\>20630175\</textID\>
\</text\>
\</text:text\>
\</text:text\>";

4 个答案:

答案 0 :(得分:1)

我认为您需要在多行初始值设定项中跳过行尾 和报价。如果有标签或换行符,你也需要逃避它们\ t \ n。

static const char *postthis="\<text:Text\
text:text=\"http://text.text.text/text/text/\"\n\
text:text=\"text:text:text-text-text\">\n\
<text:Text>\n\
<text text="http://text.com/text\"\>\n\
<textID>20630175</textID>\n\
</text>\n\
</text:text>\n\
</text:text>";

答案 1 :(得分:0)

将文本放入文件并阅读文件时,花费的时间要好得多。手工编辑XML肯定会适得其反。

如果您正在使用iOS项目,则可以使用NSString初始化程序:

- (id)initWithContentsOfFile:(NSString *)path usedEncoding:(NSStringEncoding *)enc error:(NSError **)error

或者如果你正在使用香草C的话

#include <stdio.h>

#define BUFF_SIZE 1024

int main(int argc, char **argv) {

    char s[BUFF_SIZE];
    FILE *fp = fopen( "file.xml", "r" );
    int i = 0;

    while ( !feof(fp) && i < BUFF_SIZE-1 ) {
        s[i++] = fgetc(fp);
    }
    s[i]='\0';

    printf("My string is here %s\n", s);

}

答案 2 :(得分:0)

您需要在C字符串内转义的唯一字符是\"。没有理由引用<。换行可以转义,或者你可以将它们包含为\ n(我更喜欢,因为它可以让你更好地缩进IMO)。但是,你不能简单地嵌入不带引号的换行符(这可能是你的主要问题)。

XML支持'"作为引用,因此您几乎可以使用'简化您的生活。

static const char *postthis=
"<text:Text\n"
"  text:text='http://text.text.text/text/text/'\n"
"  text:text='text:text:text-text-text'>\n"
"  <text:Text>\n"
"    <text text='http://text.com/text'>\n"
"      <productID>20630175</textID>\n"
"    </text>\n"
"  </text:text>\n"
"</text:text>";

当然,XML不需要新行,所以你可以放弃它们,除非你想让它成为人类阅读。

请注意,上面使用了多部分C字符串。 (多个“...”连接在一起。)我不记得添加了什么版本的C(或者它是否是GNU扩展)。如果你不能使用它,那么你可以逃避换行:

static const char *postthis=
"<text:Text\
  text:text='http://text.text.text/text/text/'\
...
</text:text>";

但它使缩进更难以定制,而不会使您的代码看起来更糟。

答案 3 :(得分:0)

有关字符串文字中的所有转义序列,请参阅http://en.cppreference.com/w/cpp/language/escape。如果您希望它们保持不变,则需要对它们进行转义。您在字符串中需要的任何新行都需要写为\ n。

如前所述,您可以将文本保存在文件中并在运行时读取它。

如果你想要编写很多文本到你的程序中,另一个简单的解决方案是使用objcopy:

objcopy -I binary -O elf64-x86-64 -B i386 --rename-section .data=.rodata,alloc,load,readonly,data,contents your_text.txt your_text.o

这将为您提供一个包含以下符号的目标文件:

_binary_your_text_txt_start
_binary_your_text_txt_end
_binary_your_text_txt_size

链接your_text.o并使用符号访问文本。例如:

#include <stdio.h>

extern char _binary_your_text_txt_start;
extern char _binary_your_text_txt_end;
extern char _binary_your_text_txt_size;

int main(int argc, char *argv[])
{
  const char * b = &_binary_your_text_txt_start;
  const char * e = &_binary_your_text_txt_end;
  size_t s = (size_t)&_binary_your_text_txt_size;

  fwrite(b, s, 1, stdout);

  return 0;
}