0

たとえば、文字列を取り、文字"abc123def"列形式で数値を返す C の関数を作成しようとしています: "123"

私は C の経験がほとんどないので、isDigit()関数を正しく使用しているかどうか疑問に思っていました。問題を解決するためのより良い方法がある場合は、私のコードを以下に示します。助けていただければ幸いです。ありがとう!

char findNumber(char *str1)
{
    char num1[] = "";
    int i = 0;
    int j = 0;
    while(str1[i] != '\0') {
            if(isDigit(str1[i])) {
                    num1[j] = str1[i];
                    j++;
            }
            i++;
    }
    num1[j] = '\0';
    return num1;
}

int main(int argc, const char* argv[])
{
    char str2[] = "!3254";
    printf(findNumber(str2));
    return 0;
}

次のようなエラーが表示されます。

undefined reference to `isDigit'

return makes integer from pointer without a cast

これらの原因は何ですか?

4

2 に答える 2

3

char *単一の文字を返すだけでなく、一連の文字を返すため、関数を返す必要があります。

Google で簡単に検索したところ、isdigitで定義されていることがわかったctype.hので、小文字にDして を含めますctype.h

また、長さ 0 の文字列に対してのみメモリを割り当てるため、未定義の動作が発生します。プログラムが数秒/分以上実行される場合は、対応する場所が必要です。num1char *num1 = malloc(someSize)free

修正後のコード:

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

#define MAX_SIZE 100

char *findNumber(char *str1)
{
    char *num1 = malloc(MAX_SIZE);
    // using "strlen(str1)+1" instead of MAX_SIZE might be preferred
    int i = 0, j = 0;
    while(str1[i] != '\0') {
            if(isdigit(str1[i])) {
                    num1[j] = str1[i];
                    j++;
            }
            i++;
    }
    num1[j] = '\0';
    return num1;
}

int main(int argc, const char* argv[])
{
    char str2[] = "!3254";
    printf(findNumber(str2));
    return 0;
}

テスト

于 2013-04-22T22:46:12.517 に答える
2

これはうまくいくはずです:

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

char* findNumber(char *str1)
{
    char* num1=malloc(strlen(str1)+1);//allocate memory for the number
    int i = 0;
    int j = 0;
    while(str1[i] != '\0') {
            if(isdigit(str1[i])) {//isdigit() is in ctype.h
                    num1[j] = str1[i];
                    j++;
            }
            i++;
    }
    num1[j] = '\0';
    return num1;
}

int main(int argc, const char* argv[])
{
    char str2[] = "!3254";
    char* number=findNumber(str2);
    printf("%s\n",number);
    free(number);//free the allocated memory
    return 0;
}
于 2013-04-22T22:58:26.637 に答える