[英]Remove punctuation at beginning and end of a string
我有一個字符串,我只想刪除其開頭和結尾的所有標點符號,而不能刪除中間的所有標點符號。
我編寫了一個代碼,僅從字符串的第一個和最后一個字符中刪除標點符號,如果字符串的末尾有2個或更多個標點符號,這顯然效率很低並且沒有用。
這是一個例子:
{ Hello ""I am:: a Str-ing!! }
所需的輸出
{ Hello I am a Str-ing }
我可以使用任何功能嗎? 謝謝。
到目前為止,這是我所做的。 我實際上是在鏈接列表中編輯字符串
if(ispunct(removeend->string[(strlen(removeend->string))-1]) != 0) {
removeend->string[(strlen(removeend->string))-1] = '\0';
}
else {}
遍歷字符串,使用isalpha()檢查每個字符,將傳遞給新字符串的字符寫入。
遍歷字符串,在傳遞的第一個字符開始寫入新字符串之后,使用isalpha()
檢查每個字符。
向后遍歷新字符串,用\\0
替換所有標點符號,直到找到不是標點符號的字符。
好吧,在一段while
迭代中,多次調用strtok
函數以用字符分隔每個單個字符串 (空白)。 您也可以使用
sscanf
代替strtok
。
然后,對於每個字符串,您都必須執行一個for
循環,但是要從字符串的末尾開始直到開始為止。一旦遇到!isalpha(current character)
,請在當前字符串位置放置\\0
。 您已經消除了尾巴的標點符號。
現在,做一套for
在同一串周期。 現在從0
到strlen(currentstring)
。 !isalpha(current character)
continue
。 如果isalpha
則將當前字符和所有剩余字符放入buffer
。 buffer
是清理后的字符串。 將其復制到原始字符串中。
對其他strtok
的輸出重復上述兩個步驟。 結束。
char *rm_punct(char *str) {
char *h = str;
char *t = str + strlen(str) - 1;
while (ispunct(*p)) p++;
while (ispunct(*t) && p < t) { *t = 0; t--; }
/* also if you want to preserve the original address */
{ int i;
for (i = 0; i <= t - p + 1; i++) {
str[i] = p[i];
} p = str; } /* --- */
return p;
}
#include <stdio.h>
#include <ctype.h>
#include <string.h>
char* trim_ispunct(char* str){
int i ;
char* p;
if(str == NULL || *str == '\0') return str;
for(i=strlen(str)-1; ispunct(str[i]);--i)
str[i]='\0';
for(p=str;ispunct(*p);++p);
return strcpy(str, p);
}
int main(){
//test
char str[][16] = { "Hello", "\"\"I", "am::", "a", "Str-ing!!" };
int i, size = sizeof(str)/sizeof(str[0]);
for(i = 0;i<size;++i)
printf("%s\n", trim_ispunct(str[i]));
return 0;
}
/* result:
Hello
I
am
a
Str-ing
*/
構造一個微型狀態機。 cha2class()函數將字符分為等效類。 狀態機將始終跳過標點符號,除非狀態機左右具有字母數字字符。 在這種情況下,它將被保留。 (即狀態3中的memmove())
#include <stdio.h>
#include <string.h>
#define IS_ALPHA 1
#define IS_WHITE 2
#define IS_PUNCT 3
int cha2class(int ch);
void scrutinize(char *str);
int cha2class(int ch)
{
if (ch >= 'a' && ch <= 'z') return IS_ALPHA;
if (ch >= 'A' && ch <= 'Z') return IS_ALPHA;
if (ch == ' ' || ch == '\t') return IS_WHITE;
if (ch == EOF || ch == 0) return IS_WHITE;
return IS_PUNCT;
}
void scrutinize(char *str)
{
size_t pos,dst,start;
int typ, state ;
state = 0;
for (dst = pos = start=0; ; pos++) {
typ = cha2class(str[pos]);
switch(state) {
case 0: /* BOF, white seen */
if (typ==IS_WHITE) break;
else if (typ==IS_ALPHA) { start = pos; state =1; }
else if (typ==IS_PUNCT) { start = pos; state =2; continue;}
break;
case 1: /* inside a word */
if (typ==IS_ALPHA) break;
else if (typ==IS_WHITE) { state=0; }
else if (typ==IS_PUNCT) { start = pos; state =3;continue; }
break;
case 2: /* inside punctuation after whitespace: skip it */
if (typ==IS_PUNCT) continue;
else if (typ==IS_WHITE) { state=0; }
else if (typ==IS_ALPHA) {state=1; }
break;
case 3: /* inside punctuation after a word */
if (typ==IS_PUNCT) continue;
else if (typ==IS_WHITE) { state=0; }
else if (typ==IS_ALPHA) {
memmove(str+dst, str+start, pos-start); dst += pos-start;
state =1; }
break;
}
str[dst++] = str[pos];
if (str[pos] == '\0') break;
}
}
int main (int argc, char **argv)
{
char test[] = ".This! is... ???a.string?" ;
scrutinize(test);
printf("Result=%s\n", test);
return 0;
}
int main (int argc, char **argv)
{
char test[] = ".This! is... ???a.string?" ;
scrutinize(test);
printf("Result=%s\n", test);
return 0;
}
輸出:
Result=This is a.string
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.