C中的转义字符

Escaping characters in C

我想将字符串中的所有特殊字符替换为转义等价字符 (\n \t \ \")。我的想法是使用 reader 和 writer,然后将 \ 放在任何特殊字符之前。我使用动态 array/char 指针。

由于我对自己对指针的理解不太自信,所以有时我仍然倾向于使用数组而不是指针。

像往常一样,我得到的大部分(仅)垃圾作为输出。我从哪里得到这种未定义的行为?到目前为止我的代码:

char *escapeChars(const char *src)
{
    int i, counter = 0, j = 0;
    size_t size = strlen(src) + 1;
    char pr[size], *pw;
    pr[0] = '[=10=]';

    strcat(pr, src);  /*to get the constness away*/
    pw = pr;
    for(i = 0; i < ((int) sizeof(pr)); i++){
            if(pr[i] == '\n' || pr[i] == '\t' || pr[i] == '\' || pr[i] == '\"'){
                    counter++;
            }
    }
    pw = malloc(sizeof(pr) + (size_t) counter);

    for(i = 0; i <((int) sizeof(pr)); i++){
            if(pr[i] != '\n' || pr[i] != '\t' || pr[i] != '\' || pr[i] != '\"'){
                    pw[i+j] = pr[i];
            } else {
                    pw[i+j] = '\';
                    pw[i+j+1] = pr[i];
                    j++;
            }
    }
    pw[i + j] = '[=10=]';
    return pw;
}

作为输出,我得到了完全错误的东西。而且我相信遇到第一个特殊字符时它会失败。

Original string: Some
string   with "special characters". And \.
Result: Some
str

如果有任何不清楚的地方,请告诉我。

您需要特殊情况将 '\n' 替换为 '\' + 'n'

无需制作 src 的本地副本即可扫描特殊字符。您可以这样简化代码:

char *escapeChars(const char *src) {
    int i, j;
    char *pw;

    for (i = j = 0; src[i] != '[=10=]'; i++) {
        if (src[i] == '\n' || src[i] == '\t' ||
            src[i] == '\' || src[i] == '\"') {
            j++;
        }
    }
    pw = malloc(i + j + 1);

    for (i = j = 0; src[i] != '[=10=]'; i++) {
        switch (src[i]) {
        case '\n': pw[i+j] = '\'; pw[i+j+1] = 'n'; j++; break;
        case '\t': pw[i+j] = '\'; pw[i+j+1] = 't'; j++; break;
        case '\': pw[i+j] = '\'; pw[i+j+1] = '\'; j++; break;
        case '\"': pw[i+j] = '\'; pw[i+j+1] = '\"'; j++; break;
        default:   pw[i+j] = src[i]; break;
        }
    }
    pw[i+j] = '[=10=]';
    return pw;
}

请注意,您还应该转义一些其他字符:'\r',以及 ASCII 中 1 到 31 和 127 到 255 范围内的非打印或不可移植字符。将它们转义为八进制序列需要更多工作,但可以根据您的技能水平进行管理。