我有这个字符串
"go for goa"
,输出应为
"go for goa"
我想删除多余的空格。这意味着应该用一个空格替换两个或多个连续的空格。我想使用就地算法来做到这一点。
以下是我尝试过的代码,但不起作用:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* Function to remove spaces in an string array */
char *removeSpaces(char *str) {
int ip_ind = 1;
/* In place removal of duplicate spaces*/
while(*(str + ip_ind)) {
if ((*(str + ip_ind) == *(str + ip_ind - 1)) && (*(str + ip_ind)==' ')) {
*(str_ip_ind-1)= *(str + ip_ind);
}
ip_ind++;
}
/* After above step add end of string*/
*(str + ip_ind) = '\0';
return str;
}
/* Driver program to test removeSpaces */
int main() {
char str[] = "go for go";
printf("%s", removeSpaces(str));
getchar();
return 0;
}
答案 0 :(得分:4)
大多数解决方案似乎都是不必要的复杂化:
#include <ctype.h>
#include <stdio.h>
void strip_extra_spaces(char* str) {
int i, x;
for(i=x=0; str[i]; ++i)
if(!isspace(str[i]) || (i > 0 && !isspace(str[i-1])))
str[x++] = str[i];
str[x] = '\0';
}
int main(int argc, char* argv[]) {
char str[] = " If you gaze into the abyss, the abyss gazes also into you. ";
strip_extra_spaces(str);
printf("%s\n",str);
return 0;
}
答案 1 :(得分:3)
我甚至不知道你的功能是怎么做的。首先,第一次通过,-1将在字符串开始之前访问。尝试类似:
char *removeSpaces(char *str) {
char *inp = str, *outp = str;
int prevSpace = 0;
while (*inp) {
if (isspace(*inp)) {
if (!prevSpace) {
*outp++ = ' ';
prevSpace = 1;
}
} else {
*outp++ = *inp;
prevSpace = 0;
}
++inp;
}
*outp = '\0';
return str;
}
答案 2 :(得分:1)
你没有检查空间..你正在检查一个标签。将\ t替换为(我的意思是空间..)
答案 3 :(得分:1)
您的if
条件不起作用。我会告诉你我的代码。它与您的类似,仅使用两个指针:back
和front
。
如果front
不是空格,或者front
是空格但back
不是空格,则需要将front
复制到back+1
。
char *removeSpaces(char *str)
{
if (*str == '\0') return str;
char *back = str;
char *front = str + 1;
/* In place removal of duplicate spaces*/
while(*front != '\0')
{
if (*front != ' ' || *back != ' ') // highlight
*(++back) = *front;
front++;
}
/* After above step add end of string*/
*(back + 1) = '\0';
return str;
}
希望这可以帮助你。
答案 4 :(得分:0)
问题:
ip_ind
,你必须加入,只有在没有删除的情况下,因为删除时,
场景将等于递增。""
您的方案将失败,为避免此情况,请添加如下所示的检查参数(方法1),或者从{0}开始,如(方法2)中所示。 (感谢@Lee Daniel Crocker) <强>解决方案:强>
你可以尝试这样。,
方法1:ip_ind从一个开始。
ip_ind
方法2:ip_ind从零开始。
/* Function to remove spaces in an string array */
char *removeSpaces(char *str)
{
int ip_ind = 1;
char *ptr;
if(*str)
return str;
/* In place removal of duplicate spaces*/
while(*(str + ip_ind))
{
if ( (*(str + ip_ind) == *(str + ip_ind - 1)) && (*(str + ip_ind)==' ') )
{
ptr = str + ip_ind;
//Functionality for removal of spaces.
do{
*(ptr-1) = *ptr;
}while(*ptr++ != '\0');
}
else //Inc only if deletion is not done.
ip_ind++;
}
/* After above step add end of string*/
*(str + ip_ind) = '\0';
return str;
}
答案 5 :(得分:0)
你去了:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* Function to remove spaces in an string array */
char *removeSpaces(char *str) {
int ip_ind = 0;
while (*(str+ip_ind) != 0) {
if (*(str + ip_ind++) == 32) {
if (*(str + ip_ind) == 32) {
int x=ip_ind;
while (*(str + x +1) != 0) {
*(str + x)= *(str + 1 + x++);
}
*(str + x)= 0;
--ip_ind;
}
}
}
return str;
}
/* Driver program to test removeSpaces */
int main() {
char str[] = "go for go";
printf("%s\n", str);
printf("%s\n", removeSpaces(str));
char str2[] = "go for go for go";
printf("%s\n", str2);
printf("%s\n", removeSpaces(str2));
return 0;
}
输出:
dda$ ./a.out
go for go
go for go
go for go for go
go for go for go
dda$
答案 6 :(得分:0)
简单适用于您
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char a[100];
int i,t,k;
scanf("%[^\n]s",a);
t=strlen(a);
for(i=0;i<t;)
{
if((a[i]==' ')&&(a[i+1]==' '))
{
for(k=i+1;k<t;k++)
{
a[k]=a[k+1];
}
t=t-1;
}
else
i++;
}
printf("%s",a);
return 0;
}
答案 7 :(得分:0)
请告诉最佳答案左空格@end吗?这里是JS的简单翻译:
function strip_extra_spaces(str) {
var i, x;
for (i = x = 0; str[i]; ++i)
if (!isspace(str[i]) || (i > 0 && !isspace(str[i - 1])))
str[x++] = str[i];
str[x] = '\0';
return str;
}
str = " If you gaze into the abyss, the abyss gazes also into you. ";
console.log(
strip_extra_spaces(str.split(""))
.join("")
.replace(/\0.+/g, "")
.replace(/\s/g, '☐')
)
function isspace(c) {
return c == ' ';
}
在C#中寻找相似的东西来比较多个字符串,并受到recursion.ninja和Efficient way to remove ALL whitespace from String?的相似C#答案的启发,这也引起了问题-完全删除了空格。
public static string TrimAllWithInplaceCharArray(string a) {
var len = a.Length;
var srcA = a.ToCharArray();
int dstIdxA = 0;
int planSpace = 0;
for (int i = 0; i < len; ++i) {
var ch = srcA[i];
switch (ch) {
case '\u0020': case '\u00A0': case '\u1680': case '\u2000': case '\u2001':
case '\u2002': case '\u2003': case '\u2004': case '\u2005': case '\u2006':
case '\u2007': case '\u2008': case '\u2009': case '\u200A': case '\u202F':
case '\u205F': case '\u3000': case '\u2028': case '\u2029': case '\u0009':
case '\u000A': case '\u000B': case '\u000C': case '\u000D': case '\u0085':
if (planSpace == 1) planSpace = 2;
break;
default:
if (planSpace > 1)
{
srcA[dstIdxA++] = ' ';
}
srcA[dstIdxA++] = ch;
planSpace = 1;
break;
}
}
return new string(srcA, 0, dstIdxA);
}