【问题标题】:In C, trying to remove extra whiteSpace in char* and replace with only one space between words在 C 中,尝试删除 char* 中的多余空格并仅替换为单词之间的一个空格
【发布时间】:2020-05-02 17:40:14
【问题描述】:

我正在尝试从我的 char* 中删除不必要的空格以供将来使用。基本上,我希望单词之间只有一个空格,并删除单词之间的任何额外空格、制表符或换行符。我相信当前的代码几乎可以工作,但是我无法读取存储在数组中的单个字符的内存。此外,任何解决方案都不得具有最大字符大小,因此如果需要动态内存分配,也需要考虑这一点。有没有办法让这个工作?谢谢

编辑 1:尾随和前导空格也应删除。感谢来自莫斯科的@Vlad 的澄清


int main()
{
    char* fileString1;
    fileString1=removeAdditionalWhiteSpace(fileString1);
}
char* removeAdditionalWhiteSpace(char* wordList) 
{
    char characterHolder;
    char* finalList[strlen(wordList)];
    char* delimeter = wordList;
    int i = 0;
    do 
    {
        finalList[i] += characterHolder;
        char* hasSpace = NULL;
        while (*delimeter == ' ' || *delimeter == '\n' || *delimeter == '\t')
        {
            if(*delimeter == ' ')
            {
                if(hasSpace==NULL)
                {
                    hasSpace = delimeter;
                    characterHolder = *delimeter;                           
                }
                else
                {
                    ++delimeter;
                }
            }
            else if(*delimeter == '\n' || *delimeter == '\t')
            {
                *delimeter = ' ';
                if(hasSpace==NULL)
                {
                    hasSpace = delimeter; 
                    characterHolder = *delimeter;                          
                }
                else
                {
                    ++delimeter;
                }
            }
        }
        hasSpace=NULL;
        characterHolder = *delimeter; 
        i++;      
    } 
    while( (*wordList++ = *delimeter++) );
    return *finalList;
}

【问题讨论】:

  • “我相信”。请更准确。究竟是什么问题?它会崩溃吗?它是否适用于某些输入而不适用于其他输入?另外,这真的是你的代码吗? fileString1 未设置为任何内容。请举例说明准确输入、预期结果和实际结果。
  • finalList[i] += characterHolder; 在第一个循环中,characterHolder 没有设置任何内容。
  • finalList[i] 也没有被初始化。
  • @DegaClaw 不清楚是否需要删除字符串的前导和尾随空格
  • 为什么要使用第二个缓冲区?这样的事情可以就地完成。

标签: c compression whitespace c-strings removing-whitespace


【解决方案1】:

简约的方法:


size_t delspaces(char * str)
{
size_t src, dst;
size_t cnt;

for (cnt=src=dst=0; str[dst] = str[src++]; ) {
        if (isspace(str[dst])) {
                if (dst && !cnt++) str[dst++] = ' '
                continue;
                }
        cnt=0;
        dst++;
        }

        // remove trailing spaces
while (dst && isspace(str[dst-1])) str[--dst] = 0;

        // return the string length of the resulting string
        // (which could be useful for the caller)
return dst;
}

最后说明:最后一个 while() 可能是 if(),因为只能有一个尾随空格。

【讨论】:

    【解决方案2】:

    看起来超级复杂的男人。

    这是一个从字符串中删除空格的简单函数:
    " This is a test \t of some \n Extra white space. "

    #include <stdio.h>
    #include <ctype.h>
    
    void removeWS(char* text)
    {
        char* d = text;
    
        while (isspace(*text)) ++text;
    
        while(*text)
        {
            *d = isspace(*text)? ' ' : *text;
            text++;
            while (isspace(*d) && isspace(*text)) ++text;
            if (*text) d++;
        }
    
        *d = *text;
    }
    
    
    int main(void) {
        char text[] = "  This   is a test  \t of some   \n Extra white  space.  ";
    
        removeWS(text);
        printf("%s\n", text);
    
        return 0;
    }
    

    样本输出:

    Success #stdin #stdout 0s 4284KB
    This is a test of some Extra white space.
    

    【讨论】:

    • 简单,但是 O(n^2)。如果您复制到缓冲区而不是尝试就地操作,将会更快并且同样简单。当然这样的一行没关系,但是对于一个大文件...
    • @LeeDanielCrocker 不支持 n^2。两个循环碰撞同一个指针。
    • 他只需要单词之间的空格。你也应该修剪字符串
    【解决方案3】:

    您的函数没有意义并且具有未定义的行为。

    例如变量characterHolder没有初始化,它被添加到指针finalList[i]

    char characterHolder;                 // <===
    char* finalList[strlen(wordList)];
    char* delimeter = wordList;
    int i = 0;
    do 
    {
        finalList[i] += characterHolder;  // <===
        //….
    

    如果您需要从字符串中删除多余的空格,包括其前导和尾随空格,则该函数可以如下面的演示程序所示。

    #include <stdio.h>
    #include <ctype.h>
    
    char * remove_duplicate_spaces( char *s )
    {
        char *src = s, *dsn = s;
    
        while ( isspace( ( unsigned char )*src ) ) ++src;
    
        do
        {
            char c = *src;
    
            if ( isspace( ( unsigned char )c ) ) c = ' ';
    
            if ( c == ' ' )
            {
                while ( isspace( ( unsigned char ) *++src ) );
                if ( *src )
                {
                    *dsn++ = c;
                }
            }
    
            *dsn++ = *src;
        } while ( *src++ );
    
        return s;
    }
    
    int main(void) 
    {
        char s[] = "\t\tIt is\t\ta      very\nlong\nstring.\t\t";
    
        printf( "\"%s\"\n", s );
    
        printf( "\"%s\"\n", remove_duplicate_spaces( s ) );
    
        return 0;
    }
    

    它的输出是

    "       It is       a      very
    long
    string.     "
    "It is a very long string."
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-29
      • 1970-01-01
      • 2014-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-22
      相关资源
      最近更新 更多