我有一个带有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);
答案 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
相同的字符串。