编译以下代码后,我像
输入:./a.out stack'n'overflow
输出:
stacknoverflow
输入:./a.out stack"n"overflow
输出:
stacknoverflow
输入:./a.out stack\noverflow
输出:
stacknoverflow
上述输入的预期输出:
stack
overflow
这是我的代码:
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("string from comand line : %sn", argv[1]);
}
字符串或代码中的字符中的"转义序列"由编译器在编译时解析。它根本不在运行时处理。
如果你在POSIX系统(如macOS或Linux或类似系统(中,那么你可以在运行程序时使用shell插入换行符:
$ ./a.out '`echo -n -e "stacknoverflow"`'
这将调用echo
命令并要求它回显字符串"stacknoverflow"
而不尾随换行符(这就是-n
选项的作用(。嵌入的"n"
将由echo
解析(因为-e
选项(,并在它"打印"的字符串中插入换行符。echo
打印的输出将作为单个参数传递给程序。
唯一的其他选择是显式解析程序中的字符串,并在找到字符'\'
后跟字符'n'
时打印换行符。
检查这个程序,输入:堆栈''溢出
输出:堆栈
溢出
#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 : %sn",argv[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] != ' ')
{
putchar(s[i]);
i++;
}
}
}