我正在尝试编写一个代码来删除句子空间的所有前导,尾随和中间,但只保留单词之间的一个空格。
例如,如果输入是
" 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';
}
如果有人能提出一些想法,我将不胜感激,谢谢。
答案 0 :(得分:4)
答案 1 :(得分:2)
你可以有两个数组和两个计数器。每次迭代你总是增加你的第一个计数器,但只有当角色不是空格时才增加第二个计数器。它的表格看起来像这样。
Char In-Pos Out-Pos
' ' 0 0
' ' 1 0
' ' 2 0
' ' 3 0
'T' 4 0
'h' 5 1
'i' 6 2
's' 7 3
' ' 8 4
' ' 9 5
' ' 10 5
' ' 11 5
'i' 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' 23 12
'r' 24 13
'i' 25 14
'n' 26 15
'g' 27 16
' ' 28 17
' ' 29 18
' ' 30 18
' ' 31 18
答案 2 :(得分:2)
#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;
}
答案 3 :(得分:1)
您可以在第一个实例中使用字符串标记生成器,并将空格(“”)用作分隔符。为了这个目的,你使用strtok.After你解析strtok函数的输出,并为每个元素,如果它包含更多的空格字符,你消除它们。您还将每个更正的元素放在另一个数组中。 然后,您所要做的就是解析新数组并在每个元素后面添加一个空格。如果您喜欢这个想法,我可以为您提供代码草案。
答案 4 :(得分:1)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char** split(const char *str, const char *delimiter, size_t *len){
char *text, *p, *first, **array;
int c;
char** ret;
*len = 0;
text=strdup(str);//strdup not standard
if(text==NULL) return NULL;
for(c=0,p=text;NULL!=(p=strtok(p, delimiter));p=NULL, c++)//count item
if(c==0) first=p; //first token top
ret=(char**)malloc(sizeof(char*)*c+1);//+1 for NULL
if(ret==NULL){
free(text);
return NULL;
}
//memmove?
strcpy(text, str+(first-text));//skip until top token
array=ret;
for(p=text;NULL!=(p=strtok(p, delimiter));p=NULL){
*array++=p;
}
*array=NULL;
*len=c;
return ret;
}
void free4split(char** sa){
char **array=sa;
if(sa!=NULL){
free(array[0]);//for text
free(sa); //for array
}
}
int main(void){
char str[100] = " This is my string ";
char **words;
size_t len=0;
int i;
words = split(str, " \t", &len);
*str = '\0';
for(i = 0;i<len-1;++i){
strcat(str, words[i]);
strcat(str, " ");
}
strcat(str, words[i]);
printf("\"%s\"\n", str);
free4split(words);
return 0;
}