【问题标题】:I have to replace multiple blanks in a string with a single blank in C我必须用 C 中的单个空格替换字符串中的多个空格
【发布时间】:2021-10-29 09:21:11
【问题描述】:

这是我想出的代码:

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

void delit(char *s, int i) {
  int n = 0;
  for (int j = i; j < strlen(s) - 1; j++) {
    s[j] = s[j + 1];
  }
  printf("%s", s);
}

int main() {
  char s[100];
  printf("gimme string with less than 100 chars");
  gets(s);
  int l = strlen(s);
  for (int i = 0; i <= l - 2; i++) {
    if (s[i] == s[i + 1] && s[i] == ' ') {
    delit(char *s, int i);
    }
  }
  printf("after processing %s", s);
}

这不起作用并显示 2 个错误:

//函数'delit'的参数太少{delit(char *s, int i);}

//ction 'main':tempCodeRunnerFile.c:20:16: error: 'char'之前的预期表达式{delit(char *s, int i);}

请指教。

【问题讨论】:

  • {delit(char *s, int i);} 这不是你在 C 中调用函数的方式。只需传递变量,而不是它们的类型:{delit(s, i);}
  • 你把类型放在你的函数调用中,你只在定义函数的时候把那些放在,delit(s,i)
  • 永远不要*曾经使用getsIt's so dangerous 已从 C 语言中删除。使用例如fgets 代替。
  • @Samuel 好的,我修复了它,它正在工作,但只适用于两个空格。例如,如果有 3 个空格,它会返回 2 个空格而不是 1 个空格??
  • @yano 好的,我修复了它,它正在工作,但只适用于两个空格。例如,如果有 3 个空格,它会返回 2 个空格而不是 1 个空格??

标签: c duplicates char c-strings function-definition


【解决方案1】:

这个函数不正确。

void delit(char *s, int i) {
  int n = 0;
  for (int j = i; j < strlen(s) - 1; j++) {
    s[j] = s[j + 1];
  }
  printf("%s", s);
}

假设传递的字符串是" A"。字符串长度等于3,存储为字符数组{ ' ', ' ', 'A', '\0' }

所以循环看起来像

  for (int j = 0; j < 2; j++) {

在循环之后你会得到字符串{ ' ', 'A', 'A', '\0' },而不是正确的字符串{ ' ', 'A', '\0' }

另外,找到重复的空格字符后将所有字符向左移动是低效的。

在主这条记录内

delit(char *s, int i);

是一个无效的函数声明,没有返回类型而不是函数调用。

还有函数gets is unsafe,不受C 标准支持。相反,请使用函数fgets

我将按照下面的演示程序所示的方式定义函数delit

#include <stdio.h>

char * delit( char *s, char c )
{
    if ( c != '\0' )
    {
        for ( char *p = s, *q = s; *p++; )
        {
            if ( *p != c || *( p - 1 ) != c )
            {
                if ( ++q != p ) *q = *p;
            }
        }
    }       
    
    return s;
}

int main(void) 
{
    char s[] = "Hello     world!";
    
    printf( "\"%s\"\n", s );
    printf( "\"%s\"\n", delit( s, ' ' ) );

    return 0;
}

程序输出是

"Hello     world!"
"Hello world!"

【讨论】:

    【解决方案2】:

    您的主要问题是您尝试调用函数delit(char *s, int i)。在 main() 内部,您使用 delit(char *s, int i) 调用该函数。您不需要将类型放在函数调用中,所以它应该只是delit(s, i)

    这应该使您的代码编译。

    要处理多个空格,您可以将 main 中的循环更改为仅在字符不是两个空格时才前进:

    for (int i=0;i<=l-1;)
    {
        if (s[i]==s[i+1] && s[i]==' ')
        {
            delit(s,i);
        }else{
            i++;
        }            
    }
    

    【讨论】:

    • 已修复。现在可以了。但仅适用于 2 个空格。例如,如果有三个空格,则返回 2(而不是 1),谢谢
    • @glorytothe12suns 查看我的多个空格修复编辑
    • @glorytothe12suns Input "x y\n" --> "x yy", "x \n" --> 明显的无限循环。
    猜你喜欢
    • 2011-09-04
    • 2012-01-11
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多