反斜杠和双反斜杠

时间:2018-06-26 10:37:19

标签: c

我有一个带有path的文件。但是我用C无法正确阅读它们。 文件中一行的示例:

C:\Trust\The\process.txt

我想要这个:

C:\\Trust\\The\\process.txt

但是如何用双反斜杠替换反斜杠? 我有这个功能:

/*  Replace a string */
char* replace(char* text, char* replace, char* element) {
  int i, j, k;

  int searchSize = strlen(text);
  int replaceSize = strlen(replace);
  int size = strlen(element);

  char* ret;

  if (!searchSize) {
    ret = malloc(size + 1);
    for (i = 0; i <= size; i++) {
      ret[i] = element[i];
    }
    return ret;
  }

  int retAllocSize = (strlen(element) + 1) * 2; 
  ret = malloc(retAllocSize);

  int bufferSize = 0; 
  char* foundBuffer = malloc(searchSize); 

  for (i = 0, j = 0; i <= size; i++) {
    if (retAllocSize <= j + replaceSize) {
      retAllocSize *= 2;
      ret = (char*) realloc(ret, retAllocSize);
    }

    else if (element[i] == text[bufferSize]) {
      foundBuffer[bufferSize] = element[i];
      bufferSize++;


      if (bufferSize == searchSize) {
        bufferSize = 0;
        for (k = 0; k < replaceSize; k++) {
          ret[j++] = replace[k];
        }
      }
    }

    else {
      for (k = 0; k < bufferSize; k++) {
        ret[j++] = foundBuffer[k];
      }
      bufferSize = 0;

      ret[j++] = element[i];
    }
  }


  free(foundBuffer);

  return ret;
}

我以为我可以这样使用,但它不起作用:

char *token ;
char s[]="C:\Trust\The\process.txt";
token=replace("\0x5c","\\",s); 

4 个答案:

答案 0 :(得分:1)

执行此操作时:

char s[]="C:\Trust\The\process.txt";

您的反斜杠在编译时就消失了。例如,\ T成为选项卡。致电

token=replace("\0x5c","\\",s); 

s的内容已经被编译器“编辑”,反斜杠也消失了。

您的测试用例必须是

char s[]="C:\\\\Trust\\\\The\\\\process.txt";

,当您调用replace函数时,您将在s中使用单反斜杠。

答案 1 :(得分:1)

将注释放在一起,您需要了解C源代码中的字符串中的反斜杠是转义字符。意思是“下一个字符有特殊含义”。

要在C字符串字符串中添加单个反斜杠字符,您必须告诉编译器“必须在字符串中添加此反斜杠”,然后在您的字符串中添加两个反斜杠源代码,因此已编译代码中的字符串将有一个反斜线。总结:

char s[]= "C:\\my\\dir"";

在您的源代码中,编译后的代码中将包含一个字符串:

C:\my\dir

答案 2 :(得分:1)

如果您正在从输入文件input.txt中读取文件,并且每个文件名都以换行符结尾,那么这应该可以:

#define MAX_LINE_LEN 1024
int main(int argc, char *argv[])
{
  /* File read variables */
  FILE *fp;
  char buf[MAX_LINE_LEN];
  char *token;

  /* Open input file */
  fp=fopen(argv[1], "r");
  if(fp == NULL)
  {
    fprintf(stderr, "Unable to open input file.  Exiting...");
    return 1;
  }

  /* Get each line and print result */
  while ((fgets(buf, sizeof(buf), fp)) != NULL) {
    token=replace("\\", "\\\\", buf); 
    printf("%s", token);
  }

  fclose(fp);
  return 0;
}

输入:input.txt

C:\Trust\The\process.txt

输出:

C:\\Trust\\The\\process.txt

答案 3 :(得分:0)

您的问题陈述中有些混乱:

变量定义char s[]="C:\Trust\The\process.txt";不正确。它应该写为:

char s[] = "C:\\Trust\\The\\process.txt";

编译器将字符串文字中的\字符解释为转义字符,以对特殊和非打印字符进行编码。 \\代表字符串中的单个\字符。

文件内容中的\字符不需要以任何方式加倍或转义。除非您在读取文件时执行某种类型的解析,否则读取的字符将不受影响地存储在内存中,并且文件中的序列C:\Trust\The\process.txt将被读取为与s相同的字符串。