【问题标题】:Printing specific character from a string in C从C中的字符串打印特定字符
【发布时间】:2015-01-21 14:25:06
【问题描述】:

我正在为字符串添加前缀,例如:com 应该给我c co com。 我知道在 printf("%.5s",string) 中打印一个字符来打印前五个值。我想在一个循环而不是 5 中执行此操作,如何将其替换为 i,这是一个递增值,类似于 printf("%.is",string)。我怎样才能得到这个?

【问题讨论】:

    标签: c string printf


    【解决方案1】:

    printf 格式说明符中,所有字段宽度(点之前)和精度(点之后)都可以用星号* 给出。对于每个星号,在打印对象之前必须有一个额外的 int 参数。

    所以,对于你的问题:

    printf("%.*s", i, string);
    

    注意附加参数必须是int,所以如果你有其他整数类型,你应该强制转换它:

    size_t len = strlen(len);
    if (len > 2) printf("%.*s", (int) (len - 2), string);
    

    【讨论】:

      【解决方案2】:

      这是实现您想要的最简单的方法。

      printf("%.*s\n", i, string);
      

      如果你想生成格式字符串,你也可以这样做

      char format[100]; /* the size should be estimated by you */
      
      snprintf(format, sizeof(format), "%%.%ds", i);
      printf(format, string)
      

      检查snprintf()返回值以确保字符串没有被截断,如果你为格式字符串选择了一个合理的大小,这不太可能,但你还是应该检查一下。

      以上,格式说明符的意思

      • 文字"%"
      • 然后是"."
      • 然后是整数"%d"
      • 然后信"s"

      因此生成的字符串将是您需要传递给printf() 的格式字符串。

      【讨论】:

      • 你能解释一下吗?
      • 你为什么要问我的答案?
      • sizeof(int)*CHAR_BIT / 3 对于十进制的INT_MAX 就足够了,所以在这种情况下,缓冲区char format[3 + sizeof(int)*CHAR_BIT/3 + 2]; 就足够了。
      【解决方案3】:

      试试这个:

      char s[] = "com";  
      for(size_t i = 1; i <= strlen(s); i++)
      {
          for(int j = 0; j < i; j++)  
               printf("%c", s[j]);
          printf(" ");  
      }
      

      【讨论】:

      • @Gopi;我没有投反对票,但你的答案是错误的。
      • 这应该是sizeof(或strlen(...) + 1,但可能把它放在循环之外)得到c co com
      • 另外,不要那样使用strlen()。将其存储在某处,而不是在每次迭代时调用它。
      • @iharob;现代编译器足够聪明,可以对其进行优化。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-08
      • 2017-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-26
      相关资源
      最近更新 更多