2012-02-21 33 views
0

我想从命令行捕获特殊字符,例如\ n到C程序中。例如,对于下面的程序,如果我运行./a.out“\ nfoo \ n”,我想打印(换行符)foo(换行符)而不是“\ nfoo \ n”。我如何捕获到一个字符串?C:如何将命令行的特殊字符捕获到一个字符串中

#include <stdio.h> 
#include <string.h> 

int main(int argc, char ** argv){ 
    if(argc >1){ 
     char * s = strdup(argv[1]); 
     printf("%s\n", s); 
     free(s); 
    } 
    return 0; 
} 

编辑:对不起,通过(新行),富(新行),我的意思是acutal输出

目前,输出是字面意思是 “\ NABC \ n”(换行。不会打印,因为s会捕获“\ n”2个字符而不是'\ n'字符)。对此感到抱歉。

回答

2

创建一个新字符串,遍历旧字符串,将字符添加到新字符串中。如果您看到'\'字符,请根据旧字符串中的下一个字符为新字符串添加一个特殊字符。

+0

是。澄清一下,没有库函数可以为你做,所以你必须自己做。例如,如果您在字符串中找到\,然后是't',则输出一个制表符char。像这样的东西;你必须把它拼出来。 – 2012-02-21 21:17:07

1

C字符串不能动态增长,因此您需要为新字符串分配空间并填充所需内容。但要知道需要多少个字符,您需要先通过*s并计数。一旦你计算出需要的字符数,你可以在malloc的空间中新建一个字符串,并开始遍历旧字符串并复制字符。无论何时遇到其中一个“特殊”字符,都要将相应的替换字符串复制到新字符串中。

一些代码草图(没有测试过,如果你想使用任何的这个,你必须测试和调试自己):

char* replacement(char c) { 
    if(c == '\n') 
    return "(newline)"; 
    else if(c == '\t') 
    return "(tab)"; 
    else 
    return NULL; 
} 

int charactersNeeded(char* s) { 
    int count = 0; 
    char* r; 
    while(*s != '\0') { 
    r = replacement(*s); 
    if(r != NULL) 
     count += strlen(r); 
    else 
     count++; 
    s++; 
    } 
    return count; 
} 

void copyString(char* s, char* t) { 
    /* it is assumed that t points to a buffer of sufficient length 
    to hold all the copied chars, as well as terminating null */ 
    char* r; 
    do { 
    r = replacement(*s); 
    if(r != NULL) { 
     strcpy(t, d); 
     t += strlen(d)-1; 
    } else *t = *s; 
    s++; 
    t++; 
    } while(*s != '\0'); 
} 
+0

对此感到抱歉,请参阅编辑进行说明。问题是程序捕获“\ n”为2个字符而不是'\ n'字符。 – user775614 2012-02-21 21:28:38

+0

我明白了。你需要做的仍然是类似的;首先计算所需的字符数量,分配空间,然后复制。当你正在复制字符时,当你遇到反斜杠时,将's'提前1,然后使用你发现的字符索引到查找表中,或者使用类似于'replacement'的函数(但是返回值为' char')。 – 2012-02-21 21:38:18