【问题标题】:How do you print a string in C character by character?如何逐个字符打印 C 中的字符串?
【发布时间】:2015-03-03 08:06:14
【问题描述】:

使用 printf 并且不使用任何循环或分支?

【问题讨论】:

  • 逐个字符是什么意思?它与使用printf("%s", var); 有何不同?
  • 逐个字符是什么意思?为什么不想使用循环?
  • char *str = "bla"; printf("%c%c%c\n", str[0], str[1], str[2]);

标签: c printf character


【解决方案1】:

递归是你的朋友:

int print_char_by_char(char * p)
{
  *p && print_char_by_char(p+1);
  printf("%c", *p);
  return 1;
}

int main(void)
{
  print_char_by_char("alk");
  return 0;
}

【讨论】:

  • 很好,但合乎逻辑的&& 被认为是分支,不是吗?
【解决方案2】:

扩展@alk的答案,你可以使用递归和指针来函数以避免使用逻辑运算符:

#include <stdio.h>

void dummy(char *p);
void print(char *p);

void (*fp[])(char *) = {dummy, print};

void dummy(char *p)
{
    (void)p;
}

/**
 *  Read *p as bool (0 or 1) using bitwise operators
 *  Call print() recursively if 1
 *  Call dummy() if 0 and exits from function
 */
void print(char *p)
{
    char i = *p;

    i |= i >> 4;
    i |= i >> 2;
    i |= i >> 1;
    printf("%c", *p);
    fp[i & 1](p + 1);
}

int main(void)
{
    print("Hello world\n");
    return 0;
}

【讨论】:

  • C 没有本机类型 bool,它只会为零或 1。因此 i 将为零或大于零,并在选择函数时不为 1 时导致错误。它将与 255 个条目的数组一起使用:条目 0 具有 dummy,所有其他条目具有 print_char_by_char。 (您可以将此数组设为全局。)
  • 这意味着这仅适用于 C99,不适用于较旧的电锯 C 版本(程序员必须自己做所有事情),在那些带有宏的较旧版本中,宏将执行 (x?1:0 ) 这是一个分支,因此违反了赋值(并且内置的 C99 类型 bool 使编译器生成此分支,因此也违反了赋值)。
  • 或者只是将bool i = *p;替换为int i = !!*p
  • @PaulOgilvie,不知道bool是这样实现的,谢谢指点
  • @alk,我觉得!也违反了赋值,有可能用位运算符得到一个布尔值0或者1
【解决方案3】:

嗯,你的问题是

如何逐个字符打印 C 中的字符串?

使用 printf 并且不使用任何循环或分支?

最简单的答案是

#include<stdio.h>
int main()
  {
    char a[]="blablabla";
    printf("%s",a);
    return 0;
  }

这是您问题的答案。如果这不是您想要的,请详细说明您的确切问题

【讨论】:

  • 这不是逐个字符的。它一次打印一个字符串。
  • @PaulOgilvie ,那么“逐个字符”是什么意思
  • @arun-a-s,这意味着程序员程序打印一个字符,然后例如递增字符串指针,然后程序打印另一个字符,等等。例如使用 printf("%c", *p);查看其他示例。
  • @PaulOgilvie ,我明白这一点,但我相信这个答案对于一个细节如此少的问题来说已经绰绰有余了。如果 OP 已经指定了它的用途或给出了应该做什么的例子,那么我就不会发布这个。但是对于当前的问题,我相信这个答案可以做到这一点(我的意思是,这样做将与其他答案具有相同的效果,除非需要满足某些条件,而这些条件显然尚未指定)。
【解决方案4】:

@qwe2004,告诉你的教授,Stack Overflow 社区同意这是不可能的。如果他说可以做到,我们都有兴趣看到他聪明而狡猾的做法,并学习。 (也告诉他我们会批评隐藏分支和逻辑测试。)

【讨论】:

  • 不用逻辑运算符也可以,看我的回答。
猜你喜欢
  • 1970-01-01
  • 2011-10-17
  • 2021-04-20
  • 1970-01-01
  • 1970-01-01
  • 2019-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多