【问题标题】:First index of a non-Whitespace character in astring in CC中字符串中非空白字符的第一个索引
【发布时间】:2017-09-21 10:04:14
【问题描述】:

如何获取字符串中第一个非空白字符的索引。 例如对于字符串" #$%abcd",我希望得到# 的索引3。

【问题讨论】:

  • 由于某种原因,我写的字符串中的空格没有显示在问题中。
  • 查看用于字符串和字符的 C 标准库函数。你会在那里找到相关的功能。
  • 看看strspn
  • ctype.h 中有一个名为 isspace() 的函数应该很有用。
  • @71GA:不知道你所说的“页面显示”是什么意思;我没有链接到任何东西。 strspnstring.h 中的 C 函数。

标签: c strchr


【解决方案1】:

老派:

const char *ptr;
for (ptr=str; *ptr && ((unsigned char)*ptr) <= ' '; ++ptr);
return (*ptr ? ptr-str : -1);

【讨论】:

  • 这确实对字符集做了一些假设......但它应该适用于 ASCII,前提是所有控制字符都被视为空格。 isspace((unsigned char)*ptr) 可能比 ((unsigned char)*ptr) &lt;= ' ' 更好。
  • isspace 是区域敏感的。好的,如果这就是你想要的......如果不是,那么你真的想跳过哪些字符?
【解决方案2】:

为什么不编码而不是包含其他库:
这是一个起点:

int main () 
{
    char s[] = "   #$%abcd\0";
    size_t i = 0;
    while(s[i] == ' ' || s[i] == '\t'|| s[i] == '\n' || s[i] == '\r' || s[i] == '\f' || s[i] == '\v')
    {
        ++i;
    }
    return i;
}

i 是第一个非空白字符的索引:

【讨论】:

  • @Aconcagua,是的,但是必须包含库 #include &lt;ctype.h&gt; 使其特定于实现,实现的一个小优点是 OR 开关,我按概率顺序设置字符(恕我直言)从左到右在“正常”文本中出现的次数。
  • isspace() 是标准库的一部分,因此使用它不会使代码成为特定于实现的所有代码。而 ctype.h 只是一个头文件而不是一个库......您很可能已经链接到它所附带的库,并且不会通过使用其中的函数向可执行文件添加太多额外的代码。
  • @chux,是的,你是正确的,但仍然不确定两个取消引用(在我正在查看的实现中)是否比 6 个(最坏情况)比较或切换更好或更差。也许运行个人资料工具可能会有所帮助,只是出于好奇。
  • @Dmitri,谢谢我检查并在ctype.h 中声明了isspace(),但经过短暂的测试后,代码编译时不包含任何标题,包括isspace() 函数调用。我也对library的定义感到困惑。是的ctype.h 是一个标题,但stdlib.h 也是一个标题。实现功能和宏。
  • 头文件通常实现功能(有时除了宏和内联函数)...它们只是为在别处实现的函数和对象提供声明。 stackoverflow.com/questions/924485/…
【解决方案3】:

使用strspn() 查找空格的长度,然后跳过它。

#include <stdio.h>
#include <string.h>
#include <strings.h>

const char whitespace[] = " \f\n\r\t\v";
char *str = "    Hello World!";

void main() {
    char *stripped = str + strspn(str, whitespace);
    printf("Stripped msg: '%s'", stripped);
}

【讨论】:

  • 什么是&lt;strings.h&gt;
  • OT: main() 返回 int 而不是 void
  • 是等价的。我相信 POSIX 说两者都可以使用。
  • 你怎么知道 OP 正在使用 POSIX?如果它们是等价的,那么包含两者又有什么意义呢?
  • 它可能在少数机器上编译,即仅在那些提供 both 字符串标题的机器上。
猜你喜欢
  • 2011-01-23
  • 2014-10-26
  • 1970-01-01
  • 1970-01-01
  • 2016-04-13
  • 2020-01-08
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多