在C中复制,替换或插入反斜杠

时间:2014-03-15 18:52:39

标签: c arrays

这是我关于stackoverflow的第一个问题,通常我会搜索示例并尝试理解它们,但我有点腌渍。 如果我没有以合理的速度回复,我会提前道歉,因为这是我第一次使用这个,所以这里有...

我正在创建一个新系统来尝试并可能恢复已删除的数据,以及永久删除数据的能力。

我遇到的麻烦是......

如果用户输入文件路径: C:\剃须龟

除非用户输入,否则系统将无法识别文件路径 - > C:\\剃须龟。

所以我的问题是如何复制反斜杠或用\\替换反斜杠或只是让系统识别\并在其后面添加另一个(或在前面)?

我正在VS中开发这个。

    gets(array1);
    arrayLength = strlen(array1);

    for(c = 0; c < arrayLength; c++) {
        if(array1[c] == '\\') {
            array1[c+1] = '\\';
        }
    }

    printf(array1);

    return 0;
}

我希望我没有错过任何事情,谢谢你的时间。

3 个答案:

答案 0 :(得分:2)

如果在源代码中使用常量字符串 ,则必须复制每个反斜杠字符,以便编译器将其识别为反斜杠字符,而不是而不是反斜杠后面的字母所表示的特殊字符。

例如:

char* str = "C:\not good"中,编译器会将\n标识为换行符。

char* str = "C:\\very good"中,编译器会将\\标识为反斜杠字符。

但是在运行时从键盘上读取字符串时,您无需担心这一点。

答案 1 :(得分:0)

您的功能会在第一个\之后生成所有内容\

让我们使用您的示例输入 - C:\shaving turtle

当c为2时,您会找到\

您将array1[3]设置为\

然后检查array1[3]的值,即\

您将array1[4]设置为\

直到你到达数组末尾为止。此时,您还用\替换了结尾的空字符。您的字符串不再是以空字符结尾的字符串。

您可以解决在另一个字符串中进行更改的问题。步骤进行:

  1. 浏览字符串并计算其中的反斜杠数。
  2. 创建一个大小为arrayLength+numBackslashes的新字符串。
  3. 将原始字符串复制到新字符串,同时确保在新字符串中为原始字符串中的每个反斜杠添加两个反斜杠。
  4. 希望能让你前进。

答案 2 :(得分:0)

您不需要在字符串中加倍反斜杠,但如果确实认为需要这样做,您可以将字符串复制到单独的缓冲区中,或者展开字符串在同一缓冲区中,但向后......

在第一种情况下,您不需要使用strlen,因为您将扫描字符串,并且会自然地遇到NUL终止符:

char array1[SOMETHING_BIG_ENOUGH];
char array2[2*SOMETHING_BIG_ENOUGH];
char *p = array1;
char *q = array2;
char c;

gets(array1); /* tut-tut */

while ((c = *p++) != '\0') {
    *q++ = c;
    if (c == '\\')
        *q++ = '\\';
}
*q = '\0';

这会将展开的字符串保留在array2

第二种情况比较棘手但使用的空间更少:

char array1[2*SOMETHING_BIG_ENOUGH];
char *p;
char *q;

gets(array1); /* tut-tut */

p = &array1[strlen(array1)];
q = &array1[sizeof(array1)];

*--q = '\0';

while (p != array1) {
    if ((*--q = *--p) == '\\')
        *--q = '\\';
}

这会将展开的字符串留在array1的上半部分,q指向第一个字符。