-3

コマンドのような他のテキストや他の子プロセスからの他のエラーを含むファイルからすべての電話番号を取得するプログラムを作成しました。ここで、ユーザー定義関数を使用して文字列を整数に変換しようとすると、問題に直面します。関数に格納された変換された値は、メイン プログラムに適切に返されません。代わりに、異常な値が返され、すべての実行で同じように見えます。それは私を驚かせます。誰かが私にアドバイスできますか。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char lic[128];
unsigned long long sum=0ULL;

unsigned long long stringtoint(char str[])
{
    int i=0;
    sum=0;
    if(str[strlen(str)]!='\0')
        return -1;
        //puts("Im in function");
    while(str[i]!='\0'){
        //printf("- %c -\n",str[i]);
         if(str[i] >= 48 && str[i] <= 57){
             sum = sum*10 + (str[i] - 48);
             //printf("%c and %llu\n",str[i],sum);
         }
         i++;
    }
    if(sum>0)
    printf("\nIn function passed string is %s and integer value is %llu\n",str,sum);
    return sum;
}


FILE *file;     
int main(){
        //long long int inte;
        int64_t inte;        file = fopen("receive","r"); 
        if(file!=NULL)
                while(fscanf(file,"%s",lic)!=EOF){
                        inte = 0;
                        inte=stringtoint(lic);
                        if(inte !=0){
                                printf("In Main %llu is the value of the string %s",inte,lic);
                        if(inte==sum)
                                printf("\n%llu and %llu are same\n",inte,sum);
                }
        }
        printf("\n");
        fclose(file);
        return 0;
}

このプログラムで得た結果を以下に示します。

関数で渡された文字列は 8939095683 で、整数値は 8939095683 です メインでは 349161091 は文字列 8939095683 の値です

Shameerariff@shameerariff-Satellite-L450:~/Workinffolder/ivr/IVRReporting$ ./datadecoder

関数で渡された文字列は 8939095683 で、整数値は 8939095683 です メインでは 349161091 は文字列 8939095683 の値です

Shameerariff@shameerariff-Satellite-L450:~/Workinffolder/ivr/IVRReporting$ ./datadecoder

関数で渡された文字列は 8939095683 で、整数値は 8939095683 です メインでは 349161091 は文字列 8939095683 の値です

貴重なご意見をお待ちしております。よろしくお願いいたします。

4

2 に答える 2

1

Point 1.変える必要がある

int stringtoint(char str[])

unsigned long long stringtoint(char str[])

ポイント 2. %lldは の正しい書式指定子ではありませんunsigned long long。使用する%llu

于 2015-02-24T14:41:44.787 に答える
1

誰かが私にアドバイスできますか。

はい。独自の関数を作成するのではなく、C 標準ライブラリで利用可能な関数を使用するのは、配列atoiを操作する場合、関数を使用して を処理する場合、または C++ を使用して文字列から int を読み取る場合です。後者では、基本的に C++ の標準ライブラリで を開いたときに直接取得できるファイル ストリームをそのまま使用できます。charstoistd::stringiostreamifstream

編集: /を使用するべきではありませんが、atoi/を実際に使用して、数値が保持できるよりも大きくなる可能性があるという事実を反映する必要があります。stoiatollstroulint

また、電話番号は整数ではありません。多くの国では、市外局番は 0 で始まりますが、これは数値型では表すことができません。実際、電話番号は数字ではなく、数字の並びです。

于 2015-02-24T14:42:13.093 に答える