【问题标题】:How to find the length of a string in one line in C programming? [closed]如何在C编程中找到一行字符串的长度? [关闭]
【发布时间】:2016-08-19 08:56:05
【问题描述】:

这里是一小段代码。

int len(char *str)
{
    int count = 0;
    while(*str++)
        count++;
    return count;
}

现在几天前,我发现了一个能够在一行中完成此操作的代码。基本上在 while 的条件下有一些一行代码,它负责查找字符串的长度并返回它。这是脏代码?是的,但它很有趣,所以我想我会尝试使用它,但我似乎不记得它到底是什么。那么有没有办法在一行代码中做到这一点?

编辑: 很抱歉没有提到没有像 strlen 这样的库调用这一事实。这个函数必须是自包含的。

【问题讨论】:

  • size_t length = strlen(str);.
  • 删除新行,你也可以做到一行! int len(char*str){int count=0;while(*str++)count++;return count;} 现在你只需要弄清楚你用它实现了什么。事实证明,这只会使代码更丑 - 生成的二进制文件将是相同的。 代码行数和程序效率之间几乎没有任何关系
  • 更适合代码高尔夫堆栈交换。
  • return strchr(str, 0) - str;
  • 请大家关闭这个问题。它不清楚而且太宽泛。而且我们不需要这么多低于标准的strlen 克隆。甚至有人可能认为使用它们是个好主意!

标签: c string string-length


【解决方案1】:

如果您不想使用strlenfor,请考虑递归。

例如:

int len(const char * s)
{
    return (*s) ? (1 + len(s+1)) : 0;
}

解释:

使用三元运算符 (?:) 代替 if,如果通过指针 s(第一个字母)到达的数据不是 \0,我们将按 +1len 计算该字符字符串的其余部分。

注意:

s 指向空(即s == NULL)或“字符串”不是以零结尾时,函数会失败。

【讨论】:

  • 恭喜,您不仅完全扼杀了可读性,而且还扼杀了任何性能暗示。没有比这更糟糕的代码了。
  • @Lundin 是的,我永远不会在我的程序中写这个,但问题是......这就是我的答案
  • 不管怎样,愚蠢的答案的数量清楚地表明这应该在 Code Golf 上询问。
【解决方案2】:

您可以使用strlen(const char *s)


当然你也可以用网盘:

int len(char*str){int count=0;while(*str++)count++;return count;}

但它只有在你的字符串以null结尾时才能正常工作,如果不是,你会发现一些意想不到的结果......

【讨论】:

  • @OhadEytan 不,这根本不明显。使用strlen 是实际编程中的正确答案。
  • 不是所要求的,而是唯一真正的(= 在任何或多或少严肃的代码中考虑)选项。 +1
  • 如果不是以null结尾的,就不是字符串。
  • @ThomasAyoub 这叫做规范。如果您的库记录了“此函数将采用以空字符结尾的字符串-...”并且在原始字符数组中作为参数进行了一些低寿命折腾,则库没有义务处理该错误,也不对其负责。
  • @ThomasAyoub:OP 大约是 string 的长度。字符串(在标准的第 7.1.1 节中)定义为“空终止”。您将未以 null 结尾的内容传递给 any 对字符串操作的标准库函数(例如 strlen()),您会得到未定义的行为,这是您的错,而不是库的错。那里的每个第三方库也是如此。除此之外...假设您将一个未终止的数组作为函数的参数。您将如何确定该数组的长度? (提示:你不能。)
【解决方案3】:

唯一真正的解决方案是使用strlen

也就是说,怎么样:

char *s = str; while(*s++);
size_t l = (s - str) - 1;

我不会把它放在一行中,因为删除换行符并不难,编译器也不在乎。

【讨论】:

  • 一个不错的解决方案,但实际上是 3 行
  • @user694733 操作,感谢您指出这一点。固定。
  • @VolAnd 然后删除换行符。 “一行”的解决方案完全没有意义......我可以添加换行符以使它们需要多行。
  • 显然应该写成char*s=str;while(*s)??<++*s,s++;%>ptrdiff_t l=*--s-+*str-1;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-19
  • 2018-01-22
  • 2012-06-23
  • 2021-06-01
  • 2019-12-24
相关资源
最近更新 更多