如何使用 ' 打印字符串 ' 在两行的中间?

问题描述 投票:0回答:3

我有一个问题。我需要在 C 中创建一个程序,它将一个字符串作为参数并打印它。问题是:如果我将

\n
\t
放在中间,我的程序会将其打印为
n
t
。但我需要将它们打印为新行或表格。程序必须理解
\n
\t
。我该怎么做?

预期结果:

$> ./my_program aaa\nbbb
aaa
bbb
$>

我的(不正确的)结果:

$> ./my_program aaa\nbbb
aaanbbb
$>

那是我的代码:

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char **argv)
{   
    int i = 0;
    //printf("%s", argv[1]); - that doesn't works also :(
    while (argv[1][i] != '\0') {
        printf("%c", argv[1][i]);
        i++;
    }
    return (0); 
}

我尝试使用

printf
write
功能。我试图将其打印为字符串或字符...

c printf
3个回答
4
投票

一旦你有了一个嵌入换行符的字符串,将它打印成两行就非常简单了——几乎任何可以打印出字符串的东西都可以做到这一点。

#include <stdio.h>

int main() { 
    char const *s = "aaa\nbbb";
    printf("%s", s);
    return 0;
}

结果:

aaa
bbb

所以,你面临的问题不是打印出字符串,甚至与 C 本身根本无关。您真正的问题归结为:“如何传递带有嵌入式换行符的命令行参数?”幸运的是,有一种非常简单的方法可以做到这一点(至少使用 bash 或 zsh)。让我们从一个打印第一个命令行参数的简单程序开始:

#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;
    }
    printf("%s", argv[1]);
    return 0;
}

从那里开始,一切都与我们如何调用程序有关:

./a.out aaa$'\n'bbb

结果:

aaa
bbb

这里的“技巧”是

$'\n'
,它告诉shell“扩展”
\n
,因此调用的程序会将其视为换行符。


3
投票

您的程序一次输出一个字符的命令行参数:使用

%s
达到相同的结果:

#include <stdio.h>

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

问题来自命令外壳处理

\
字符的方式。您的 shell 不会将
\n
解释为命令行参数中的换行符,而是将其解释为引号和
\
本身的转义符。

您可以通过以这种方式引用参数来在命令行参数中传递换行符:

$> ./my_program 'aaa
bbb'
aaa
bbb
$> 

或者,您可以通过编写

\
./my_program aaa\\nbbb
./my_program 'aaa\nbbb'
传递给程序,并修改程序以明确解释转义序列:

#include <stdio.h>

int print_escaped_string(const char *s) {
    int n = 0;
    while (*s != '\0') {
        unsigned char uc = *s++;
        if (uc == '\\') {
            switch (*s) {
              case '\\':             s++; break;
              case 'n': uc = '\n';   s++; break;
              case 't': uc = '\t';   s++; break;
              case 'e': uc = '\033'; s++; break;
            }
        }
        putchar(uc);
        n++;
    }
    return n;
}

int main(int argc, char **argv) {   
    for (int i = 1; i < argc; i++) {
        print_escaped_string(argv[i]);
    }
    return 0; 
}

0
投票

要打印 2 个字符

\
n
或打印 2 个字符
\
t
作为换行符和制表符,处理字符串以查找
\
开始 escape sequence.

C 定义了 4 个转义序列。

  • 简单转义序列
  • 八进制转义序列
  • 十六进制转义序列
  • 通用字符名称

只看simple-escape-sequences,C 定义: \' \" \? \

所以除了 ,代码可以查找所有这些

int main(int argc, char *argv[]) {
  if (argc > 1) {
    const char *s = argv[1];
    while (*s != '\0') {
      if (*s == '\\') {
        s++;
        const char c[] = {'\"', '\'', '?', '\\', 'a', 'b', 'f', 'n', 'r', 't', 'v', 0};
        const char e[] = {'\"', '\'', '?', '\\', '\a', '\b', '\f', '\n', '\r', '\t', '\v', 0};
        const char *find = strchr(c, *s);
        if (find && *find) {
          putchar(e[find - c]);
        } else {
          fprintf(stderr, "Invalid escape sequence found \\%3o\n", (unsigned char) *s);
          break;
          // or perhaps look for the other 3 types of escape sequences...
        }
      } else {
        putchar(*s);
      }
      s++;
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.