首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C中复制、替换或插入反斜杠

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

Stack Overflow用户
提问于 2014-03-15 18:52:39
回答 3查看 102关注 0票数 1

这是我关于堆栈溢出的第一个问题,通常我会寻找例子并试图理解它们,但我有点为难。如果我没有以合理的速度回复,我提前表示歉意,因为这是我第一次使用这个,所以这里…

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

我遇到麻烦的是..。

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

除非用户输入->C:\剃须刀,否则系统不会识别文件路径。

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

我是用VS开发的。

代码语言:javascript
复制
    gets(array1);
    arrayLength = strlen(array1);

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

    printf(array1);

    return 0;
}

我希望我没有错过任何东西,谢谢你抽出时间。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-15 19:16:58

您不需要重复使用字符串中的反斜杠,但是如果您真的觉得有必要这样做,可以将字符串复制到单独的缓冲区中,或者在同一个缓冲区中展开字符串,但是可以向后.

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

代码语言:javascript
复制
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中保留展开字符串。

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

代码语言:javascript
复制
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指向第一个字符。

票数 0
EN

Stack Overflow用户

发布于 2014-03-15 19:06:20

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

例如:

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

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

但是,在运行时从键盘读取字符串时,不必担心这一点。

票数 2
EN

Stack Overflow用户

发布于 2014-03-15 19:03:36

您的函数将使第一个\成为\之后的一切。

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

当c为2时,可以找到一个\

您将array1[3]设置为\

然后检查array1[3]的值,它是一个\

您将array1[4]设置为\

这种情况一直持续到数组的末尾。此时,您还用\替换了结束空字符。您的字符串不再是以空结尾的字符串。

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

  1. 遍历字符串并计算其中反斜杠的数目。
  2. 创建一个大小为arrayLength+numBackslashes的新字符串。
  3. 将原始字符串复制到新字符串,同时确保为原始字符串中的每个反斜杠在新字符串中放置两个反斜杠。

希望这能让你继续前进。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22428254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档