Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中转义char*字符串中的特殊字符_C_String_Escaping - Fatal编程技术网

如何在C中转义char*字符串中的特殊字符

如何在C中转义char*字符串中的特殊字符,c,string,escaping,C,String,Escaping,我从fgets函数中得到一个字符串。我想把这个字符串清理成一个新的字符串,这样第二个字符串就可以替换所有特殊的和潜在的危险字符,类似于PHP中使用addslashes()或mysql\u real\u escape\u string()所能做的事情。如PHP手册中所定义: mysql\u real\u escape\u string()调用mysql的库函数mysql\u real\u escape\u string,它将反斜杠前置到以下字符:\x00、\n、\r、\、'、”和\x1a 我不打算

我从fgets函数中得到一个字符串。我想把这个字符串清理成一个新的字符串,这样第二个字符串就可以替换所有特殊的和潜在的危险字符,类似于PHP中使用addslashes()或mysql\u real\u escape\u string()所能做的事情。如PHP手册中所定义:

mysql\u real\u escape\u string()调用mysql的库函数mysql\u real\u escape\u string,它将反斜杠前置到以下字符:\x00、\n、\r、\、'、”和\x1a

我不打算将此数据发送到mysql查询,也没有与任何SQL server的当前连接,只想在linux机器上运行的简单CLI C程序中清理它。这将用于简单的静态分析。我在这里研究了其他几个问题,但没有得到它

void clean_string(char * origin, char * destiny)
{ 
   //copies the origin to destiny scaping characters
}

您可以直接使用字符串。循环遍历字符数组的每个位置,如果您有一个特殊字符,则只需将其替换为其他字符即可

#include <stdio.h>
#include <string.h>

int main()
{
  char str[] = "Hello\tworld\n!";
  int i, len;

  len = strlen(str);

  printf("%s\n", str);

  for (i = 0; i < len; ++i) {
    switch (str[i]) {
    case '\n':
      str[i] = '$';
      break;
    case '\t':
      str[i] = '$';
      break;
    }
  }

  printf("%s\n", str);

  return 0;
}
#包括
#包括
int main()
{
char str[]=“你好\tworld\n!”;
int i,len;
len=strlen(str);
printf(“%s\n”,str);
对于(i=0;i
仍不清楚为什么您认为字符串具有“危险”字符,但如果您想逃离其中一些字符:

const char *str = "my dangerous";
const char *ooh = "aeoui\\";

char buf[BIG_ENOUGH];
size_t bp = 0;

for (size_t sp = 0; str[sp]; sp++) {
    if (strchr(ooh, str[sp])) buf[bp++] = '\\';
    buf[bp++] = str[sp];
}
buf[bp] = 0;

你尝试过什么?标准C没有这样的函数,我也不知道POSIX函数有这样的功能。你的代码应该在哪个平台上运行?没有“特殊的和潜在的危险”字符,除非你(或其他什么)这样解释它们。最好准确地定义您想要的内容。@mafso我将使用fgets。我不太理解您的代码:想法是*str是我想要scape的字符串?oops是我想要scape的字符的示例字符串吗?我如何将\\和\n字符都scape到\\\\\\n?str是原始字符串,ooh包含“危险的“字符”(例如,aeoui和反斜杠)。buf是以null结尾的输出。将ooh设置为“\\\n”,它将转义反斜杠和换行符。@SajhuNote,这不会将“\n”转换为“\\n”,所以打印的输出将在字符串的末尾包含反斜杠,但不是一个字符串,就好像它可以传递回c编译器一样。您的答案对我来说非常不清楚。请尝试解释它的作用,并使用描述性变量名。@TimKuipers:如果在ooh-危险字符集中找到str的字符,它会在字符前加上反斜杠。sp代表字符串指针,bp代表缓冲区指针。它是一种字符串复制例程,在必须转义的每个字符之前插入\。我看不出有多少重命名的需求,因为这个方案对于C程序员来说是惯用的——比如vec、pr、Escape&e等等。干杯