在c中用一个空格替换两个连续的空格

时间:2012-03-22 08:40:31

标签: c

  

可能重复:
  How do I replace multiple spaces with a single space in C?

我在c中有一个字符串,可以包含两个连续的空格。我想用一个空格删除两个连续的空格。我怎样才能做到这一点?请帮助。

5 个答案:

答案 0 :(得分:2)

如果在字符串中出现两个连续空格的情况,那么可能会使用strstr()memmove()

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

int main()
{
    char s[] = "a string with two  spaces";
    char* two_spaces_ptr = strstr(s, "  ");
    printf("[%s]\n", s);
    if (two_spaces_ptr)
    {
        memmove(two_spaces_ptr + 1,
                two_spaces_ptr + 2,
                strlen(two_spaces_ptr + 2) + 1); /* +1 to copy the NULL. */

    }
    printf("[%s]\n", s);

    return 0;
}

输出:

[a string with two  spaces]
[a string with two spaces]

memmove()州的C标准:

  

memmove函数将s2指向的对象中的n个字符复制到   s1指向的对象。复制就像对象中的n个字符一样   由s2指向的第一个被复制到n个字符的临时数组中   重叠s1和s2指向的对象,然后重写n个字符   临时数组被复制到s1指向的对象中。

编辑:

更新了使用memmove()代替导致未定义行为的strcpy()的答案。

答案 1 :(得分:0)

您可以使用strchr函数搜索字符串中的空格,然后使用逻辑跟进它以替换它后面的所有空格。您需要为另一个空格补丁重复此操作,直到字符串结束。

答案 2 :(得分:0)

你可以写自己的字符串:

char *ys = YOUR_STRING;
char *n = ys;
while (*ys)
{
  *n = *ys;
  if (*ys == ' ')
    while (*ys == ' ')
      ys++;
  else
    ys++;
  n++;
}

或者您可以创建一个新字符串:

char *ys = YOUR_STRING;
char *n = malloc(sizeof(*n) * strlen(ys));
int i = 0;

while (*ys)
{
  n[i++] = *ys;
  if (*ys == ' ')
    while (*ys == ' ')
      ys++;
  else
    ys++;
}
// use n

答案 3 :(得分:-1)

for (unsigned char *p = YOUR_STRING, *q = p; ((*q = *p));) {
        if (*q++ == ' ') {
                while (*++p == ' ');
        } else {
                p++;
        }
}

不那么模糊的替代方案:

unsigned char *p = YOUR_STRING;
unsigned char *q;
/* zap to the first occurrence */
while (*p && *p++ != ' ');
/* copy from here */
q = --p;
while ((*q = *p)) {
        if (*q++ == ' ') {
                while (*++p == ' ');
        } else {
                p++;
        }
}

答案 4 :(得分:-1)

如果您确定最多只能连续两个空格,您可以执行以下操作:

int main ()
{
    char *str="This  is a  wonderful world. Let's  have a   good  time here.";
    int len=strlen(str);
    char *result = (char*)malloc(len);
    int j=0;
    for(int i=0;i<len;i++) {
        if(str[i]==' ' && str[i-1]==' ') {
            i++;
        }
        result[j++]=str[i];
    }
    result[j]='\0';
    printf("%s\n", result);
  return 0;
}