0

「電卓の追加」に問題があります。Valgrind はメモリ エラーもコンパイラからのエラーも報告しませんが、プログラムは printf にもかかわらず出力を表示しません - "Base is ".

すべてのポインターと変数は (n 私の意見では) 正しく初期化されています。

getnumchar *関数は数値を取得し、 char -へ のポインターを返します。add関数は 2 つの数値を文字列として処理します。これは char ( )へreturnのポインターでもあります。resultchar *

問題がメモリの割り当てなのか、配列の処理に接続されたプロシージャなのかはわかりません...

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

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

#define MAX(A,B) ((A)>(B) ? (A) : (B))

char *getnum(FILE *infile, int base)
{
    int len = 10;
    int c;
    int pos = 0;
    char *num = NULL;
    char *tmpnum = NULL;

    num = malloc(sizeof(char)*len);

    while (((c = fgetc(infile)) != EOF) && (isalnum(c))) {

        if (isdigit(c)) {
           /* irrelevant*/
        }
        else if (isalpha(c)) {
            fprintf(stderr, "Wrong base, expected 16\n");
            free(num);
            return NULL;

        }
        if (pos >= len) {
            /*realloc*/
        }
    }

    return num;           
}

int main(int argc, char **argv)
{
    FILE *infile = NULL;
    char *number1 = NULL;
    char *number2 = NULL;
    char *result = NULL;
    int base, i, j = 0, length, count = 0;


    infile = fopen(argv[1], "r");

    base  = atoi(argv[2]);
    while (!feof(infile)) {
        number1 = getnum(infile, base);

        number2 = getnum(infile, base);

        break;
    }
    printf("Base is %d\n", base);
    result = add(number1, number2, base);

    length = strlen(result);
    for (i = 0; i <= length - 1; i++) {
        if (result[i] == '0') {
            count++;
        }
    }

    for (j = i; j == (length - 1); j++) {
        printf("Result is: %s\n", &result[j]);
        break;
    }
    free(result);
    result = NULL;
    fclose(infile);
    return 0;
}

過去4時間、それを解決しようとしていて、間違いを見つけることができません. 前もって感謝します!

4

2 に答える 2

2

の最後近くに重大なタイプミスが 1 つありmain()ます。

for (j = i; j == (length - 1); j++) {
/*            ^^ SHOULD BE <= */
    printf("Result is: %s\n", &result[j]);
    break;
}
于 2012-08-28T18:07:59.587 に答える
1

このコードを見ると:

for (i = 0; i <= length - 1; i++) {
    if (result[i] == '0') {
        count++;
    }
}
if (count == length) {
    printf("Result is 0\n");
    free(result);
    result = NULL;                     /* arguable */
    fclose(infile);
    return 0;
}
for (i = 0; i <= length - 1; i++) {
    if (result[i] != '0') {
        break;
    }
}
for (j = i; j == (length - 1); j++) {
    printf("Result is: %s\n", &result[j]);
    break;
}
  1. 出力数値のゼロの総数を数えてから、先頭のゼロの数をもう一度数えるのではなく、この 2 つを組み合わせてみませんか?
  2. 最後のループは何ですか?それは実際にはループではありません- is の場合iは1回実行length - 1され、そうでない場合はまったく実行されません(おそらく、テスト入力で後者のケースに遭遇しています)。

例えば

for (count = 0; count < length; count++) {
    if (result[count] != '0')
        break;
}
if (count == length) {
    printf("Result is 0\n");
    free(result);
    result = NULL;                     /* arguable */
    fclose(infile);
    return 0;
}
printf("Result is: %s\n", &result[count]);
于 2012-08-28T18:21:55.177 に答える