[英]How to remove spaces that are in a string sentence
我正在嘗試編寫代碼以刪除所有開頭,結尾和中間的句子空間,但在單詞之間僅保留一個空格。
例如,如果輸入是
" 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';
}
如果有人可以提出一些想法,我將不勝感激,謝謝。
您可以有兩個數組和兩個計數器。 每次迭代總是增加第一個計數器,但是只有當字符不是空格時才增加第二個計數器。 它的表看起來像這樣。
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
#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;
}
您可以在第一個實例中使用字符串標記器,並使用空白符(“”)作為定界符。 為此,在C語言中使用strtok,然后解析strtok函數的輸出,對於每個元素,如果它包含更多的空白字符,則將其消除。 同樣,您將每個更正后的元素放在另一個數組中。 然后,您要做的就是解析新數組,並在每個元素之后添加一個空格。 如果您喜歡這個想法,我可以為您提供代碼草案。
#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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.