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

用c中的一个空格替换两个连续空格,c,C,可能重复: 我在c中有一个字符串,它可以包含两个连续的空格。我想用一个空格删除两个连续的空格。我该怎么做?请帮忙 for (unsigned char *p = YOUR_STRING, *q = p; ((*q = *p));) { if (*q++ == ' ') { while (*++p == ' '); } else { p++; } } 不太模糊的替代方案: unsig

可能重复:

我在c中有一个字符串,它可以包含两个连续的空格。我想用一个空格删除两个连续的空格。我该怎么做?请帮忙

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++;
        }
}

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

如果字符串中存在两个连续空间的单一出现,则可能使用
strstr()
memmove()

memmove()
的C标准规定:

memmove函数将s2指向的对象中的n个字符复制到 s1指向的对象。复制的发生就像对象中的n个字符一样 s2指向的字符首先复制到一个由n个字符组成的临时数组中,该数组不包含 重叠s1和s2指向的对象,然后重叠 将临时数组复制到s1指向的对象中

编辑:


更新了答案以使用
memmove()
,而不是导致未定义行为的
strcpy()

您可以在自己的字符串上写入:

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

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

int main()
{
char*str=“这是一个美好的世界。让我们在这里玩得开心。”;
int len=strlen(str);
char*result=(char*)malloc(len);
int j=0;

对于(int i=0;iSee.字符串中是否只有一次出现两个连续的空格?您不需要替换任何内容,至少在
if/else
之后添加
//use*p char
注释。无论如何,这不起作用,因为
q
将在第一个空格之后传递空格,并导致
while
增加
p至少一次de>即使
*p
不是一个空格,你也会在
*q
*p
之间产生差异。这是一种非常模糊的方法来解决这个琐碎的任务,如果它做了你声称它做的事情。完全滥用for循环。渐进区是空的,条件做了两件事…从p复制到q,然后测试是否复制的值与\0不同…您赢得了模糊度测试down@hroptatyr这可能是丑陋的和过早的优化。对比看hmjd的代码。经过优化的编译器会内联strstr和strcpy调用,从而产生几乎完全相同的代码。好吧,不完全相同,因为他的代码是泛型的,而这段代码不是。最后,在99.9%的程序中,可读性远比性能更有价值。令人好奇的是,当在静态代码分析器(LDRA试验台)中执行时,仅此一小部分代码就违反了MISRA-C编码标准15条。好的,简单的代码。关于重叠内存的备注很重要,尽管这对于这个特定代码来说不是问题。在这里进行了测试。它们肯定会重叠,代码会在AIX@hroptatyr,更新了答案以使用
memmove()
而不是
strcpy()
防止未定义的行为。@pmg,更新了答案以使用
memmove()
而不是
strcpy()
以防止未定义的行为。不,您不一定需要创建新的行为,即使它可以提高可读性并使代码更通用。-1用于教学malloc结果的类型转换。请删除类型转换。读取和。-1用于错误代码示例,显然未经测试。@Eregrith修复。Lundin,谢谢。到目前为止,我一直都是被告知放置类型转换。:-。Paul,已修复。代码中仍然存在严重错误,例如,看看如果字符串中的第一个字符是空格会发生什么。
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
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;
}