0

文字列があり、その先頭と末尾からすべての句読点を削除したいのですが、途中から削除したいのです。

文字列の最初と最後の文字からのみ句読点を削除するコードを作成しました。これは、文字列の最後に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 {} 
4

6 に答える 6

2

文字列を繰り返し処理し、isalpha()を使用して各文字をチェックし、新しい文字列に渡される文字を書き込みます。

于 2012-07-07T13:07:10.653 に答える
0

isalpha()文字列を繰り返し処理し、通過する最初の文字が新しい文字列への書き込みを開始した後、各文字をチェックするために使用します。

新しい文字列を逆方向に繰り返し、句読点\0ではない文字が見つかるまで、すべての句読点をに置き換えます。

于 2012-07-07T13:30:03.477 に答える
0

OK、while繰り返しで、strtok関数を複数回呼び出して、各単一の文字列を文字(空白)で区切ります。sscanfの代わりに使用することもできますstrtok

次に、文字列ごとforに、文字列の最後から最初までサイクルを実行する必要があります。遭遇したらすぐに!isalpha(current character)\0を現在の文字列の位置に配置します。尾の句読文字を削除しました。

次に、同じ文字列で別のforサイクルを実行します。今0からstrlen(currentstring)。ながら!isalpha(current character) continue。現在の文字をaと残りのすべてのisalpha文字に入れる場合。クリーニングされた文字列ですbufferbuffer元の文字列にコピーします。

strtok他の出力に対して上記の2つの手順を繰り返します。終わり。

于 2012-07-07T13:55:01.140 に答える
0
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;
}
于 2012-07-07T14:00:13.467 に答える
0
#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
*/
于 2012-07-07T14:09:55.703 に答える
-1

小さなステートマシンを構築します。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
于 2012-07-07T14:19:08.367 に答える