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 范围内的非打印或不可移植字符。将它们转义为八进制序列需要更多工作,但可以根据您的技能水平进行管理。
我想将字符串中的所有特殊字符替换为转义等价字符 (\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 范围内的非打印或不可移植字符。将它们转义为八进制序列需要更多工作,但可以根据您的技能水平进行管理。