【问题标题】:Remove preceding spaces and tabs from a given string in C language从 C 语言中的给定字符串中删除前面的空格和制表符
【发布时间】:2010-12-03 15:12:54
【问题描述】:

什么 C 函数(如果有)从字符串中删除所有前面的空格和制表符?

【问题讨论】:

  • 我已更改标题以匹配文本。因为在我看来,“preceding”这个词不太可能被错误地添加。

标签: c string tabs spaces


【解决方案1】:

在 C 中,字符串由指针标识,例如 char *str,或者可能是数组。无论哪种方式,我们都可以声明我们自己的指向字符串开头的指针:

char *c = str;

然后我们可以让我们的指针越过任何类似空格的字符:

while (isspace(*c))
    ++c;

这将使指针向前移动,直到它不指向空格,即在任何前导空格或制表符之后。这使原始字符串保持不变 - 我们刚刚更改了指针 c 指向的位置。

你需要这个包含来获得isspace

#include <ctype.h>

或者,如果您愿意自己定义什么是空白字符,您可以编写一个表达式:

while ((*c == ' ') || (*c == '\t'))
    ++c;

【讨论】:

  • 从技术上讲,这会将指针“c”移动到第一个非空格字符,假设它从字符串的开头开始。它根本不会改变字符串。我指出这一点是因为如果您有另一个指向字符串开头的指针,它仍将指向字符串的原始开头,其中可能包含空格。需要明确的是,这种技术是非常受欢迎的,因为您没有在字符串中移动位,但您必须知道您正在移动指针,而不是消除空格。您必须很好地理解指针才能理解其中的区别。
  • 好点,我希望改进解释以涵盖这一点。
【解决方案2】:

一个更简单的修剪空白的函数

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

char * trim(char * buff);

int main()
{
    char buff[] = "    \r\n\t     abcde    \r\t\n     ";
    char* out = trim(buff);
    printf(">>>>%s<<<<\n",out);
}

char * trim(char * buff)
{
    //PRECEDING CHARACTERS
    int x = 0;
    while(1==1)
    {
        if((*buff == ' ') || (*buff == '\t') || (*buff == '\r') || (*buff == '\n'))
            { 
                x++;
                ++buff;
            }
        else
            break;
    }
    printf("PRECEDING spaces : %d\n",x);
    //TRAILING CHARACTERS
    int y = strlen(buff)-1;
    while(1==1)
    {
        if(buff[y] == ' ' || (buff[y] == '\t') || (buff[y] == '\r') || (buff[y] == '\n'))
            { 
                y--;
            }
        else
            break;
    }
    y = strlen(buff)-y;
    printf("TRAILING spaces : %d\n",y);
    buff[strlen(buff)-y+1]='\0';
    return buff;
}

【讨论】:

  • 我通过以通常的 C 方式初始化 char 数组修复了 main 中的缓冲区溢出:编译器在编译时为您执行复制。
  • 你知道OP只要求trimleft吗?
【解决方案3】:
void trim(const char* src, char* buff, const unsigned int sizeBuff)
{
    if(sizeBuff < 1)
    return;

    const char* current = src;
    unsigned int i = 0;
    while(current != '\0' && i < sizeBuff-1)
    {
        if(*current != ' ' && *current != '\t')
            buff[i++] = *current; 
        ++current;
    }
    buff[i] = '\0';
}

你只需要给buff足够的空间。

【讨论】:

  • 糟糕,我以为您想删除给定字符串中的“所有”空格和制表符。我错过了“之前”。希望它可以帮助别人。 :)
  • 你可以原地压缩,因为输出小于输入。
  • 我的否决票只是对这个廉价修复的提醒:合并删除给定字符串中的“所有”空格和制表符,以回答文本以澄清其关系问题。顺便说一句:别忘了把 trim 改成不那么容易误导的名字。
【解决方案4】:

您可以设置一个计数器来计算相应的空格数,并相应地将字符移动那么多空格。最终的复杂度为 O(n)

void removeSpaces(char *str) {
    // To keep track of non-space character count
    int count = 0;

    // Traverse the given string. If current character
    // is not space, then place it at index count
    for (int i = 0; str[i]; i++)
        if (str[i] != ' ')
            str[count++] = str[i]; // increment count
    str[count] = '\0';
}

【讨论】:

  • 问题文本中有preceding这个词,现在它也在标题中,所以它只是一个trim_left函数。但你的答案很容易适应。
猜你喜欢
  • 1970-01-01
  • 2010-10-20
  • 2019-01-09
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 2012-04-19
  • 1970-01-01
相关资源
最近更新 更多