0

文字と文字を含む文字列を取得し、文字のみを除外したいと考えています。次に、その文字列を再利用して配列に入れたいと思います。Cでそれを行うにはどうすればよいですか?
私は使用しましisalpha()たがprintf、変数には使用しませんでした。助けてくれてありがとう。

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

int main(void)
{
    int i;
    string w = "name1234";
    string new ="";
    int length = strlen(w);

    for (i=0; length > i; i++)
    {
        if (isalpha(w[i]))
        {
            new = w;
        }
    }
    printf("This is the new one: %s\n", new);  //it should be 'name' not 'name1234'
    return 0;
}
4

5 に答える 5

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

int main(void)
{
    int i, newx;
    char w[] = "name1234";

    int length = strlen(w);

    // in C99 or greater, you can do
    // char new[length+1];
    // to get a variable-length local array, instead of using malloc
    char* new = malloc(length+1);
    if (!new)
    {
         fprintf(stderr, "out of memory\n");
         return 1;
    }

    for (i = 0, newx = 0; length > i; i++)
    {
        if (isalpha((unsigned char)w[i]))
        {
            new[newx++] = w[i];
        }
    }
    new[newx] = '\0';

    printf("This is the new one: %s\n", new);  //it should be 'name' not 'name1234'
    free(new); // this isn't necessary since all memory is freed when the program exits
               // (and it isn't appropriate if new is a local array) 
    return 0;
}
于 2012-11-10T21:01:12.313 に答える
2

これが簡単なコードです。すべての行を理解していることを確認してください。

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

int main()
{
    char org[]="abc123defg";
    int size=sizeof(org)/sizeof(org[0]);   //size will hold the original array length 
    char* res=malloc((sizeof(char)*size)+1);  //+1 for the '\0' char that indicates end of a string
    if(!res)
        return 1; //allocation failed
    int i; int k=0;
    for(i=0;i<size;i++)
    {
        if(isalpha(org[i])) {
            res[k]=org[i];
            k++;
        }
    }
    res[k]='\0';
    printf("%s\n", res);  //now it will be abcdefg
    free(res);  //free the memory I've allocated for the result array
    return 0;
}
于 2012-11-10T21:06:30.293 に答える
1

これはアカデミック版です:

const char* w= "name1234";
char* filteredString= (char*)malloc(sizeof(char));
const long length=strlen(w);
long size=0;
for(long i=0; i<length; i++)
{
    if(isalpha(w[i]))
    {
        size++;
        filteredString=(char*)realloc(filteredString, (size+1)*sizeof(char));
        filteredString[size-1]=w[i];
    }
}
filteredString[size]=0;
puts(filteredString);

realloc の使い方を学ぶためだけに、文字列全体をスタックに割り当てて、メモリ使用量を台無しにすることもできます。realloc は CPU を消費します。

于 2012-11-10T21:17:48.033 に答える
1

string ではなく、適切なデータ型 char * を定義してください。文字列 A をフィルタリングして結果を B に入れたい場合は、次のことを行う必要があります。

1) Create char *a[size], char *b[size];
2) iterate over the "string" A and verify if the actual position (char) meets the requirements to go to the "string" B;
3) if it does, just do b[pos_b] = a[i]; and increment the variable pos_b.

配列 b では、配列 A の位置とは異なる位置にいる可能性があるため、pos_b を宣言する必要があります。そのため、配列 b に文字を追加しているだけです。

于 2012-11-10T21:01:57.393 に答える
0

さて、私はそれが正しく動作するようにあなたのコードにいくつかの小さな変更を加えました、しかしあなたはのようないくつかのライブラリを使うことができますstring.h。私はあなたがそれを理解することを願っています:

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

int main(void)
{
    int i, j = 0;
    /* I limited your strings to avoid some problems. */
    char w[20]  = "name1234";
    /* The name "new" is a reserved word in C (at least in my IDE). */
    char nw[20] = "";
    int length  = strlen(w);
    for(i = 0; i < length; i++)
    {
        /* I added the special string end character '\0'. */
        if(isalpha(w[ i ]) || w[ i ] == '\0')
        {
            nw[ j ] = w[ i ];
            j++;
        }
    }
    printf("This is the new one: %s\n", nw);
    return 0;
}
于 2012-11-10T21:05:09.880 に答える