可能重复:
How do I replace multiple spaces with a single space in C?
我在c中有一个字符串,可以包含两个连续的空格。我想用一个空格删除两个连续的空格。我怎样才能做到这一点?请帮助。
答案 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;
}