2012-01-04 3 views
0

から英数字のみを含む新しい文字列を作成しますか?私はこれを実装するについて行くだろうかだけstdio.hに、string.hのとSTDLIB.Hライブラリを使用して、古い文字列

私は私と一緒に負担してくださいプログラミングに非常に新しいです!

+7

あなたはこれまでに何を試みましたか? –

+0

あなたの宿題ですか? –

+0

@RenanGreinert:質問はOPによって「宿題」とタグ付けされました。 –

答えて

2
  1. 文字列と同じ長さの新しいchar配列を割り当てます。これが十分なスペースであることを自分自身に説得してください。 NULを忘れないでください。新しい文字列に英数字のみこれらの文字をコピーする文字列による
  2. ループ、。 <ctype.h>も含めずにこの移植性を持たせることはできません。英数字とみなすすべての文字を列挙しない限り、そのヘッダーの関数/マクロを使用してください。
  3. もう一度、NULを忘れないでください。
+0

英数字であることを確認するために、各文字がASCIIテーブルの特定の範囲にあることを確認するだけでは十分ではありませんか? – rzetterberg

+0

@rzetterberg:私は* portable *と言った。文字エンコーディング/ロケールごとに英数字が異なると考えられるものは、これに敏感な ''の関数です。 –

+0

私は知りたいので、私はあなたに質問していないので、私は尋ねています。理由を明確にしてくれてありがとう。私はスウェーデン人で、äöåがアスキーの一部ではないことを知っておくべきです:P – rzetterberg

1

これは宿題であるので、ここでの言葉による説明です:

は、元の文字列をループを実行し、文字が英数字であるかどうかを判断するための機能isalnum()を使用するには。合理的なサイズの2番目のchar arrayを維持し、AlphaNumが出現するたびにその配列に挿入してください。すべてのAlphaNum文字が2番目の配列にコピーされると、NULLが終了し、文字列があります。

注:isalnum()ctype.hで定義されているため、使用できない場合はこの機能を自分で定義する必要があります。それはそれ自身の別の行使です。

0

最良の方法は、ctype.hからisalnum()を使用することですが、今、それは私がctype.hさんisalnum()のと同じですisalnum_not_prefered()と呼ばれる規格ではない/非ポータブル機能を書かれている、オプションではありません。注意すべき

#include <stdio.h> 
#include <ctype.h> 
#include <string.h> 
#include <stdlib.h> 

int isalnum_not_prefered(char s) 
{ 
    if((s >= 'A' && s <= 'Z') || 
     (s >= 'a' && s <= 'z') || 
     (s >= '0' && s <= '9')) 
     return 1; 
    return 0; 
} 

int main(void) 
{ 
    char str[] = "this!234$#&@#$^[email protected]#$a#@$4677~=_?}valid2234kjstring"; 
    int len = strlen(str); 
    int i, j=0; 

    char *newstr1 = NULL; 
    char *newstr2 = NULL; 

    if ((newstr1 = (char *) malloc(sizeof(char) * len + 1)) == NULL) { 
     printf("unable to allocate memory \n"); 
     return -1; 
    } 

    for (i=0 ; i<len ; i++) { 
     if (isalnum(str[i])) { 
      newstr1[j] = str[i]; 
      j++; 
     } 
    } 
    newstr1[j] = '\0'; 

    if ((newstr2 = (char *) malloc(sizeof(char) * len + 1)) == NULL) { 
     printf("unable to allocate memory \n"); 
     return -1; 
    } 

    j=0; 
    for (i=0 ; i<len ; i++) { 
     if (isalnum_not_prefered(str[i])) { 
      newstr2[j] = str[i]; 
      j++; 
     } 
    } 
    newstr2[j] = '\0'; 

    printf("string : %s \n", str); 
    printf("result1 : %s \n", newstr1); 
    printf("result2 : %s \n", newstr2); 

    free(newstr1); 
    free(newstr2); 

    return 0; 
} 

ポイント:C

  1. 文字列\0で終了します。それがために設定マシンの文字を前提としていて、あなたが移入された新しい文字列はまた「free()でなければなりませんエドメモリ」\0
  2. malloc()で終了編べきで
  3. malloc()エラーが
  4. このコードを処理する必要があり
  5. はポータブルではありませんASCII。ハードウェアが他の文字セット(たとえばEBCDIC)をサポートしている場合、これは期待どおりに機能しない可能性があります。

希望します。

+0

@meiryo私の答えが役に立つと分かったら、気をつけて、その隣のチェックマークをクリックしてください。ありがとう! –

1

あなたが文字列で読んだ文字はすべて1バイトです(0から255までの数値と考えることができます)。したがって、文字が何であるかを調べるにはasciiテーブルをチェックする必要があります。

すべての英数字は、[48,58](数字の場合)、[65,90](大文字の場合)、[97,122](小文字の場合)の範囲です。この時

ルック:

#include <stdio.h> 
#include <stdlib.h> 

#define SIZE 64 

int isalphanum(char); /*states if a char is alphanumerical or not*/ 
char *getalphanum(char *, char*); /*modifies the second string to get the result*/ 

int main(void) { 
    char in[SIZE] = "Hello, [email protected]#@#@#@#@#orl...,.,d!"; /*just a random to try out*/ 
    char out[SIZE]; 
    getalphanum(in, out); 
    printf("%s", out); 
    return 0; 
} 

int isalphanum(char a) { 
    if ((a >= 48) && (a <= 58)) 
     return 1; 
    if ((a >= 65) && (a <= 90)) 
     return 1; 
    if ((a >= 97) && (a <= 122)) 
     return 1; 
    return 0; 
} 

char *getalphanum(char *s, char *t) { 
    if ((s == NULL) || (t == NULL)) /*tests if the strings are "handble"*/ 
     return NULL; 
    int i = 0; 
    int j = 0; 
    char c; 
    while ((c = *(s + i)) != '\0') { 
    if (isalphanum(c)){ 
     *(t + j) = c; 
     j++; 
    } 
    i++; 
    } 
    *(t + j) = '\0'; 
    return t; 
} 

このコードは動作し、非常に簡単で、改善することができますが、あなたが必要evertythingがあります。

+1

上記のように、ASCII表現を仮定することに注意してください。 – prelic

+1

右とにかく誰かがプログラミングを初めて経験したことがあれば、それは始めるのが良いポイントかもしれません。 – wazabit

関連する問題