【问题标题】:Removing all the blank spaces from the string in c language [duplicate]用c语言从字符串中删除所有空格[重复]
【发布时间】:2019-01-09 06:12:22
【问题描述】:

我正在尝试删除字符串中的所有空格。例如,如果字符串有两个空格,那么它将两个空格减少到只有一个空格。

我正在尝试的代码如下:

#include<stdio.h>

main()
{
    char s[] =  "Ahmed     is   not   here";
    int i,k,si = 0,n = 0,ln;
    ln = strlen(s);
    for(i=0;i<ln;i++)
    {
        n = s[i];
        if(n == 32)
        {
            si++;
            if(si>1)
            {
            s[i] = '-';
            si = 0; 
            }

        }

    }

    puts(s);
}

问题是:我不知道如何删除那个空白空间,所以我将其替换为“-”。此外,代码也会删除单个空格。请有人更正我的代码并告诉我哪里错了。

【问题讨论】:

  • 你可以把它复制到一个新的字符串中并跳转所有的''字符
  • 您可以将所有字符向左移动一个或多个索引,并以/0 终止字符串的末尾。另一种可能性是您将所有 chars 和单个空白复制到另一个数组(您不会复制其他不必要的空白)。
  • 如果所需的输出是 Ahmed is not here 并且“只有一个空白”,则重复项不能解决它,但会提供有关如何处理的线索,在您的情况下,这意味着记住“前一个字符” ”。那么如果当前字符是空格,前一个字符是空格,则可以忽略。

标签: c dev-c++


【解决方案1】:

这里已经有another answer 可以解决您的问题。在这里,它被选入您的应用程序。

代码

#include <ctype.h>
#include <stdio.h>

void stripExtraSpaces(char* str) {
  int i, x;
  for (i=x=0; str[i]; ++i) {
    if (!isspace(str[i]) || (i > 0 && !isspace(str[i-1]))) {
      str[x++] = str[i];
    }
  }
  str[x] = '\0';
}

int main()
{
  char s[] =  "Ahmed     is   not   here";
  stripExtraSpaces(s);
  puts(s);
}

说明

基本策略是遍历字符串中的每个字符,确保它不是空格并且它之前的字符也不是空格,然后移动到下一个字符。这会跳过重复的空格,只在字符串中留下单个空格。

注意

正如下面的 WeatherVane 所指出的,这也会删除一个前导空格。这可能是也可能不是您想要的。

【讨论】:

  • 请注意,这会从字符串中删除一个前导空格。 . .如果需要的话!单个前导空格是不必要的,但未提及。
  • @WeatherVane 好收获。我想不出我什么时候想要用空格引导一个字符串,但也许 OP 的要求不同。
  • 如果有人想要它,同样的概念,但使用指针并在出现一个或多个can be found here时保留一个前导空格。
【解决方案2】:

这是我找到的一个可能的解决方案,在此代码中,text 下方的 sn-p 是您的 sblanks 是您的 destination array,它将填充整个字符串但没有多个空格.

代码 sn-p

#include <stdio.h>

int main()
{
   char text[1000], blank[1000];
   int c = 0, d = 0;

   printf("Enter your text"); //Ahmed     is   not   here
   gets(text);

   while (text[c] != '\0') {
      if (text[c] == ' ') {
         int temp = c + 1;
         if (text[temp] != '\0') {
            while (text[temp] == ' ' && text[temp] != '\0') {
               if (text[temp] == ' ') {
                  c++;
               }  
               temp++;
            }
         }
      }
      blank[d] = text[c];
      c++;
      d++;
   }

   blank[d] = '\0';

   printf("Text after removing blanks\n%s\n", blank);

   return 0;
}

【讨论】:

  • (1) 从不使用gets。它是如此卑鄙,已从标准库中删除。它唯一留下的地方是先前使用的噩梦。 (2) 这在没有临时缓冲区的情况下是可行的,并且很可能是 OP 收到的任何模糊指令的意图。挑战在于实现这一目标。
  • text[temp] == ' ' &amp;&amp; text[temp] != '\0' 很好奇。为什么不只是text[temp] == ' '?我怀疑这里有编码错误。
猜你喜欢
  • 1970-01-01
  • 2014-04-01
  • 2013-09-06
  • 2014-08-26
  • 2014-02-13
  • 2019-11-25
  • 1970-01-01
  • 2015-01-13
  • 2013-12-11
相关资源
最近更新 更多