如何让C程序识别命令行参数中的\n与\t转义字符并正确输出
问题原因与解决方案
为什么会出现这个问题?
当你在命令行执行./my_program aaa\nbbb时,shell会先解析命令中的转义符:这里的\是shell的转义标记,它会去掉\,只把n作为参数的一部分传给程序,所以argv[1]实际接收的是字符串aaanbbb,程序自然输出aaanbbb。
两种解决思路
思路1:让shell传递实际的转义字符(无需修改程序)
如果你用的是bash这类支持ANSI-C转义的shell,可以用$'字符串'的格式传递参数,shell会自动把\n、\t转换成对应的控制字符:
$> ./my_program $'aaa\nbbb' aaa bbb
这种方式下,你的原程序不需要任何修改就能正确输出换行。
思路2:修改程序,手动解析转义序列
如果需要程序直接处理带\n、\t的字符串参数(比如用户用引号包裹参数传入"aaa\nbbb"),可以在程序中添加转义序列解析逻辑,把\+字符的组合转换成对应的控制字符:
修改后的代码:
#include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { if (argc < 2) { fprintf(stderr, "Usage: %s <string>\n", argv[0]); return EXIT_FAILURE; } int i = 0; while (argv[1][i] != '\0') { // 遇到转义符\,且后面还有字符时处理 if (argv[1][i] == '\\' && argv[1][i+1] != '\0') { switch (argv[1][i+1]) { case 'n': putchar('\n'); break; case 't': putchar('\t'); break; case '\\': putchar('\\'); break; // 可扩展支持更多转义符,比如\r、\b等 default: // 未知转义,直接输出原字符 putchar('\\'); putchar(argv[1][i+1]); break; } i += 2; // 跳过已处理的两个字符 } else { putchar(argv[1][i]); i++; } } return EXIT_SUCCESS; }
测试这个程序:
$> ./my_program "aaa\nbbb\tccc" aaa bbb ccc
内容的提问来源于stack exchange,提问作者Johnny Leet
相关产品推荐
相关产品推荐

