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