如何在从命令行参数获取的字符串中打印转义字符?

时间:2018-08-27 11:34:25

标签: c command-line-arguments

编译以下代码后,我像

一样运行它

输入:./a.out stack'\n'overflow

输出:

stack\noverflow

输入:./a.out stack"\n"overflow

输出:

stack\noverflow

输入:./a.out stack\\noverflow

输出:

stack\noverflow  

上述输入的预期输出:

stack    
overflow

这是我的代码:

#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("string from comand line : %s\n", argv[1]);
}

3 个答案:

答案 0 :(得分:4)

编译器在 compile-time 处解析代码中的字符串或字符中的

“转义序列”。完全不在运行时处理。

如果您使用的是POSIX系统(如macOS或Linux或类似系统),则可以在运行程序时使用Shell为您插入换行符:

$ ./a.out '`echo -n -e "stack\noverflow"`'

这将调用echo命令,并要求它回显字符串"stack\noverflow"而不尾随换行符(这就是-n选项的作用)。嵌入的"\n"将由echo解析(由于-e选项),并在它“打印”的字符串中插入换行符。 echo打印的输出将作为单个参数传递给您的程序。

唯一的另一种选择是在程序中显式分析字符串,并在找到字符'\\'后跟字符'n'时打印换行符。

答案 1 :(得分:1)

检查此程序,输入:stack'\ n'overflow
输出:堆栈
溢出

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

void addescapeseq(char *ptr)  
{  
    char *temp;  
    while(strstr(ptr,"\\n")||strstr(ptr,"\\t")||strstr(ptr,"\\r"))  
    {  
        if(temp=strstr(ptr,"\\n"))  
        {  
            *temp=10;  
            strcpy(temp+1,temp+2);  
        }  
        else if(temp=strstr(ptr,"\\r"))  
        {  
            *temp=13;  
            strcpy(temp+1,temp+2);  
        }
        else if(temp=strstr(ptr,"\\t"))  
        {  
            *temp=9;  
            strcpy(temp+1,temp+2);  
        }  
    }  
}  

int main(int argc,char *argv[])  
{  
    addescapeseq(argv[1]);  
    printf("Data : %s\n",argv[1]);  
}  

答案 2 :(得分:1)

尝试使用此功能:

void ft_putstr(char *s)
{
  int i = 0;

  while (s[i])
    {
      if (s[i] == '\\')
        {
          if (s[i + 1] == 'n')
            {
              putchar('\n');
              i += 2;
            }
        }
      if (s[i] != '\0')
        {
          putchar(s[i]);
          i++;
        }
    }
}