0

次のような入力を持つacファイルからintを取得しようとしています:

(0 3 200 3) (0 9 500 3) (98 20 500 3) (100 1 100 3) (100 100 500 3)

atoi と s は、括弧の後の最初の数字 (while ループと 1 桁より大きい strcat 数字を使用します) と 1 桁のみの数字に対しては正常に機能しますが、直後にない数字の最初の数字のみを返します。括弧。

メソッドのコードは次のとおりです。

 void allProcesses(FILE file, struct process processArray[]) {
char ch;
int number;
int a, b, c, io;
int arrayCount = 0;
int processIndex = 0;
char temp[1];

while ((ch = fgetc(&file)) != EOF) {

    if (isdigit(ch)) {

        char numberAppended[20] = "";

        while (isdigit(ch)) {
            temp[0] = ch;
            strcat(numberAppended, temp);
            ch = fgetc(&file);
        }

        char* end;
        number = (int)strtol(numberAppended, &end, 0);
        printf("The number is %d\n",number);
        int atoinum = atoi(numberAppended);



        switch (processIndex) {
            case 0:
                a = number;
                if (DEBUG == TRUE) {
                    printf("a = %c\n", a);
                    printf("NUmber a is %d\n", a);
                }
                processIndex++;
                break;
            case 1:
                b = number;
                if (DEBUG == TRUE) {
                    printf("b = %c\n", b);
                    printf("NUmber b is %d\n", b);
                }
                processIndex++;
                break;
            case 2:
                c = number;
                if (DEBUG == TRUE) {
                    printf("c = %c\n", c);
                    printf("NUmber c is %d\n", c);
                }
                processIndex++;
                break;
            case 3:
                io = number;
                if (DEBUG == TRUE) {
                    printf("io = %c\n", io);
                    printf("NUmber io is %d\n", io);
                }
                processIndex++;
                break;
            default:
                break;
        }
    }
    if (ch == ')') {
        processArray[arrayCount] = makeProcess(a, b, c, io);
        arrayCount++;
        processIndex = 0;
    }

}

}

4

1 に答える 1

1

最初コメントを読む):

char temp[1];1つのサイズを宣言しましたが2、コードに応じたサイズである必要があります(そうでない場合は、メモリがオーバーランするため、未定義の動作になります)。

char temp[2];
while (isdigit(ch)) { // from `(` to `)`
   temp[0] = ch;   // should be a null terminated 
   temp[1] = '\0'; // add this step;
   strcat(numberAppended, temp); 
   ch = fgetc(&file);
}

2番目:あなたnumberAppendedはある種の文字列に解析されます:"0 9 500 3"
そしてあなたは呼び出しています

number = (int)strtol(numberAppended, &end, 0);
                                      ^
                                      output argument

strtolの構文:

long int strtol(const char *numberAppended, char **end, int base);  

どこ

  • numberAppended:は長整数に変換される文字列です。
  • end:文字列""の長整数の直後の文字に設定されるポインタを指しますnumberAppended

そして、あなたはこのようなものを書くことになっています:(コメントを読む

end = numberAppended;  // assign to first string
// in a loop {
number = (int)strtol(end, &end, 0);  // in loop end is input &end is output
printf("The number is %d\n",number); 
//}

私の次のコードは、文字列strtol()から数値を解析および抽出するために使用する方法を理解するのに役立ちます。numberAppended

#include <stdio.h>      /* printf */
#include <stdlib.h>     /* strtol */
int main (){
  char numberAppended[] = "2001 11 223   444   566";
  char * end;
  long int li;
  end =numberAppended;
  int base =10;
  int ele = 0;
  while(li=strtol (end, &end, base)){
     printf("%ld \n", li);
     ele += 1;
  }
  printf("\nNo of elements: %d", ele);
  return 0;
}

出力:

2001 
11 
223 
444 
566 

No of elements: 5

3番目:エラーではないかもしれませんが、processIndex以前にコードの更新箇所が見つかりませんでしたswitch(){}

于 2013-03-08T21:37:14.017 に答える