在C语言中,试图删除char*中多余的空格,并用单词之间的一个空格替换

在C语言中,试图删除char*中多余的空格,并用单词之间的一个空格替换,c,compression,whitespace,c-strings,removing-whitespace,C,Compression,Whitespace,C Strings,Removing Whitespace,我正在尝试从我的char*中删除不必要的空格,以备将来使用。基本上,我只希望单词之间有一个空格,并删除单词之间的任何额外空格、制表符或新行字符。我相信当前的代码几乎可以正常工作,但我无法读取存储在数组中的单个字符的内存。此外,任何解决方案都不能有最大字符大小,因此如果需要动态内存分配,也需要考虑。有没有办法让它工作起来?谢谢 编辑1:还应删除尾随空格和前导空格。感谢莫斯科@Vlad的澄清 int main() { char* fileString1; fileString1=r

我正在尝试从我的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;
}

看起来超级复杂的人

下面是一个从字符串中删除空白的简单函数:
“这是对一些额外空白的测试。”


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

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

char characterHolder;                 // <===
char* finalList[strlen(wordList)];
char* delimeter = wordList;
int i = 0;
do 
{
    finalList[i] += characterHolder;  // <===
    //….
最低限度方法:




最后一点注意:最后一个
while()
可以是
if()
,因为只能有一个trailig空间。

“我相信”。请说得更准确些。到底是什么问题?它会崩溃吗?它是否与一些输入一起工作,而不是与其他输入一起工作?还有,这真的是你的代码吗<代码>文件字符串1未设置为任何值。请给出准确输入、预期结果和实际结果的示例。
finalList[i]+=characterHolder字符持有者未设置为任何值。
finalList[i]
也未初始化。@DegaClaw不清楚是否需要删除字符串的前导空格和尾随空格为什么要使用第二个缓冲区?像这样的事情可以就地完成。简单,但是O(n^2)。如果您复制到缓冲区而不是尝试就地操作,则速度会更快,也同样简单。当然,像这样的一行并不重要,但是对于一个大文件来说…@LeeDanielCrocker不是n^2。两个循环碰到同一个指针。他只需要单词之间的空格。你也应该修剪绳子
Success #stdin #stdout 0s 4284KB
This is a test of some Extra white space.
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."
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;
}