C 如何删除字符串句子中的空格

C 如何删除字符串句子中的空格,c,C,我试图写一个代码来删除所有的前导、尾随和中间的句子空格,但是在单词之间只保留一个空格 例如,如果输入是 " This is my string " 输出应该是 "This is my string" 到目前为止,我已经得出了以下结论: #include <stdio.h> void cascade(char str[], int i); main() { char str[100] = " This is my string

我试图写一个代码来删除所有的前导、尾随和中间的句子空格,但是在单词之间只保留一个空格

例如,如果输入是

"    This    is my     string    "
输出应该是

"This is my string"
到目前为止,我已经得出了以下结论:

#include <stdio.h>
void cascade(char str[], int i);
main()
{
    char str[100] = "    This    is my     string    ";
    int i = 0;
    while (str[i] != '\0') {
            if (str[i] == ' ' && str[i + 1] == ' ')
                    cascade(str, i);
            i++;
    }
    printf("%s\n", str);
}

void cascade(char str[], int i)
{
    while(str[i] != '\0') {
            str[i] = str[i + 1];
            i++;
    }
    str[i + 1] = '\0';
}
#包括
void级联(char-str[],int-i);
main()
{
char str[100]=“这是我的字符串”;
int i=0;
while(str[i]!='\0'){
如果(str[i]=''&&str[i+1]='')
级联(str,i);
i++;
}
printf(“%s\n”,str);
}
无效级联(字符str[],int i)
{
while(str[i]!='\0'){
str[i]=str[i+1];
i++;
}
str[i+1]='\0';
}

如果有人能提出一些想法,我将不胜感激。谢谢。

使用两个指针。第一个点指向下一个要读取的字符,第二个点指向要写入的位置

如果您在一行中读取两个空格,请不要提前写入指针



另一种方法,您可能需要考虑使用“<代码>”“<代码>”作为定界符。

使用两个指针。第一个点指向下一个要读取的字符,第二个点指向要写入的位置

如果您在一行中读取两个空格,请不要提前写入指针



另一种方法,您可能需要考虑使用“<代码>”“< /C>”作为定界符。

< P>可以有两个数组和两个计数器。每次迭代都会增加第一个计数器,但仅当角色不是空格时才增加第二个计数器。一张这样的桌子

Char In Pos Out Pos
' '      0      0
' '      1      0
' '      2      0
' '      3      0
‘T’40
“h”5 1
“我”6 2
's'73
' '      8      4
' '      9      5
' '     10      5
' '     11      5
“我”12 5
's'13 6
' '     14      7
“m”15 8
“y”16 9
' '     17     10
' '     18     11
' '     19     11
' '     20     11
' '     21     11
's'22 11
t'2312
r'2413
“我”25 14
n'26 15
‘g’27 16
' '     28     17
' '     29     18
' '     30     18
' '     31     18

您可以有两个数组和两个计数器。每次迭代都会增加第一个计数器,但仅当角色不是空格时才增加第二个计数器。一张这样的桌子

Char In Pos Out Pos
' '      0      0
' '      1      0
' '      2      0
' '      3      0
‘T’40
“h”5 1
“我”6 2
's'73
' '      8      4
' '      9      5
' '     10      5
' '     11      5
“我”12 5
's'13 6
' '     14      7
“m”15 8
“y”16 9
' '     17     10
' '     18     11
' '     19     11
' '     20     11
' '     21     11
's'22 11
t'2312
r'2413
“我”25 14
n'26 15
‘g’27 16
' '     28     17
' '     29     18
' '     30     18
' '     31     18

您可以在第一个实例中使用字符串标记器,并使用空格(“”)作为分隔符。为此,在C中使用strtok,然后解析strtok函数的输出,对于每个元素,如果它包含更多的空格字符,则消除它们。还可以将每个更正的元素放入另一个数组中。
然后,您所要做的就是解析新数组,并在每个元素后添加一个空格。如果您喜欢这个想法,我可以为您提供一个代码草案

您可以在第一个实例中使用字符串标记器,并使用空白(“”)作为分隔符。为此,在C中使用strtok,然后解析strtok函数的输出,对于每个元素,如果它包含更多的空格字符,则消除它们。还可以将每个更正的元素放入另一个数组中。
#include <stdio.h>
#include <string.h>

char* trim(char str[]){
    char *p=str;
    char *token;
    if(str == NULL) return NULL;
    if(*str == '\0') return str;

    token=strtok(str, " \t");
    if(token == NULL){
        *str = '\0';
        return str;
    }
    while(NULL!=token){
        int len;
        len = strlen(token);
        if(p != token){
            memmove(p, token, len);
        }
        p += len;
        *p++ =' ';
        token = strtok(NULL, " \t");
    }
    p[-1]='\0';

    return str;
}

int main(){
    char str[100] = "    This    is my     string    ";
    printf("\"%s\"\n", trim(str));
    return 0;
}
然后,您所要做的就是解析新数组,并在每个元素后添加一个空格。如果您喜欢这个想法,我可以为您提供一个代码草案

#包括
#include <stdio.h>
#include <string.h>

char* trim(char str[]){
    char *p=str;
    char *token;
    if(str == NULL) return NULL;
    if(*str == '\0') return str;

    token=strtok(str, " \t");
    if(token == NULL){
        *str = '\0';
        return str;
    }
    while(NULL!=token){
        int len;
        len = strlen(token);
        if(p != token){
            memmove(p, token, len);
        }
        p += len;
        *p++ =' ';
        token = strtok(NULL, " \t");
    }
    p[-1]='\0';

    return str;
}

int main(){
    char str[100] = "    This    is my     string    ";
    printf("\"%s\"\n", trim(str));
    return 0;
}
#包括 字符*修剪(字符str[]){ char*p=str; 字符*令牌; if(str==NULL)返回NULL; 如果(*str=='\0'),则返回str; 令牌=strtok(str,“\t”); if(标记==NULL){ *str='\0'; 返回str; } while(NULL!=令牌){ 内伦; len=strlen(令牌); if(p!=令牌){ memmove(p,token,len); } p+=len; *p++=''; 令牌=strtok(空,“\t”); } p[-1]='\0'; 返回str; } int main(){ char str[100]=“这是我的字符串”; printf(“\%s\”\n”,trim(str)); 返回0; }
#包括
#包括
字符*修剪(字符str[]){
char*p=str;
字符*令牌;
if(str==NULL)返回NULL;
如果(*str=='\0'),则返回str;
令牌=strtok(str,“\t”);
if(标记==NULL){
*str='\0';
返回str;
}
while(NULL!=令牌){
内伦;
len=strlen(令牌);
if(p!=令牌){
memmove(p,token,len);
}
p+=len;
*p++='';
令牌=strtok(空,“\t”);
}
p[-1]='\0';
返回str;
}
int main(){
char str[100]=“这是我的字符串”;
printf(“\%s\”\n”,trim(str));
返回0;
}
#包括
#包括
#包括
字符**拆分(常量字符*str,常量字符*分隔符,大小*len){
字符*text,*p,*first,**数组;
INTC;
字符**ret;
*len=0;
text=strdup(str);//strdup不标准
if(text==NULL)返回NULL;
for(c=0,p=text;NULL!=(p=strtok(p,分隔符));p=NULL,c++)//计数项
如果(c==0)first=p;//第一个令牌top
ret=(char**)malloc(sizeof(char*)*c+1);//+1表示空
if(ret==NULL){
免费(文本);
返回NULL;
}
//记忆