任务是删除字符串中所有多余的空格,例如,如果字符串看起来像这样:
volim OR
程序完成后,它应如下所示:
volim OR
所以程序必须删除字符串前后的所有空格以及单词之间的空格,因此最后每个单词之间只有一个空格。 这是我到目前为止所拥有的:
#include <stdio.h>
char *IzbaciViskaRazmake (char *Str)
{
char *p = Str;
char *p2 = Str;
while(*p!='\0')
{
if(*p==' ')
p++;
else if(*p!=' ')
{
*p2 = *p;
p2++;
p++;
}
}
*p2='\0';
return Str;
}
int main() {
char tekst[] = " volim OR ";
IzbaciViskaRazmake(tekst);
printf("'%s'",tekst);
return 0;
}
我的代码存在的问题是,它删除了所有空格,从而提供了输出
volimOR
我如何重新编写我的代码,因此它使单词之间保持空格。 PS-必须使用指针。
答案 0 :(得分:1)
您可以通过将第一个(空格)添加到
*p2
并跳过其余的 (空格)来实现,方法是使用{{1} }。
尝试此修改后的代码,它将起作用:-
while-loop
输出:-
#include <stdio.h>
char *IzbaciViskaRazmake(char *Str)
{
char *p = Str;
char *p2 = Str;
while (*p != '\0')
{
if (*p == ' ')
{
if (*p != *Str) // Not begining
{
*p2 = *p; // adding the first ' '
p2++;
p++;
}
while (*p == ' ') // skipping the rest ' '
{
p++;
}
}
else
{
*p2 = *p;
p2++;
p++;
}
}
if (*(p2 - 1) == ' ') //ends with space
{
p2--;
}
*p2 = '\0';
return Str;
}
int main()
{
char tekst[] = " volim OR ";
IzbaciViskaRazmake(tekst);
printf("'%s'", tekst);
return 0;
}
答案 1 :(得分:0)
Anoopknrs代码使我了解了此代码的实际工作方式,因此我设法迅速对其进行了修复。这是一项全面的工作,希望它能对其他人有所帮助。
#include <stdio.h>
#include <string.h>
char *IzbaciViskaRazmake (char *Str)
{
char *p = Str;
char *p2 = Str;
while(*p!='\0')
{
if(*p==' ')
p++;
else if(*p!=' ')
{
*p2 = *p;
p2++;
p++;
if(*p==' ')
{
*p2=*p;
p2++;
p++;
}
}
}
*(p2-1)='\0';
return Str;
}
int main() {
char tekst[] = " volim OR ";
IzbaciViskaRazmake(tekst);
printf("'%s'",tekst);
return 0;
}
答案 2 :(得分:0)
我认为您应该将其分为三个独立的任务:
这是三个非常独立的任务,在您的情况下,一个合理的假设似乎只是将<compilation></compilation>
视为空格。但是,这样的函数通常应该在失败时返回NULL指针。
因此我们可以声明此函数:
' '
现在您要编写三个函数,但是每个函数都比原始函数简单。
然后char * trimSpaces(char *str) {
if(!str) return NULL; // If we get a NULL pointer as input
if((str = trimInitialSpaces(str)) == NULL) return NULL;
if((str = trimEndingSpaces(str)) == NULL) return NULL;
if ((str = trimSuperfluousSpaces(str)) == NULL) return NULL;
return str;
}
的实现如下所示:
trimIntitialSpaces
您还有两个函数需要编写。 char * trimInitialSpaces(char *str) {
if(!str) return NULL;
char * ptr = str;
int len = strlen(str); // Get length of string
if(len == 0) return str; // If len is 0, there's nothing to do
while(*ptr == ' ' && *ptr != '\0') ptr++; // Find first non-space
// memmove can handle overlapping arrays, which memcpy cannot
memmove(str, ptr, len-(ptr-str)+1);
return str;
}
有点棘手,但总的来说与trimEndingSpaces(str)
几乎一样。然后,您只剩下trimInitialSpaces(str)
,这是最棘手的一个。但是现在您可以调试所有这三个单独的程序。祝你好运。