2017-04-22 3 views
-5

私の練習は、キーボードとプログラムの終わりから入力リストの整数を0で入力します。次に、配列の合計を出力します。これは私のコードです:私はcのエクササイズを持っています

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

const int MAX_ITEMS = 50; 
void inputIntegerNumber(int* a, int* count); 
int sumOfInteger(int* n, int* count); 

int main(int argc, char** argv) { 
    int x[MAX_ITEMS], count; 

    inputIntegerNumber(&x, &count); 
    printf("Sum of array is %d", sumOfInteger(&x, &count)); 

    return (EXIT_SUCCESS); 
} 

void inputIntegerNumber(int* a, int* count){ 
    do{ 
     printf("Please! input numbers: "); 
     scanf("%d", a); 
     *count++; 
    }while((*a != 0) && (*count != MAX_ITEMS)); 

} 

int sumOfInteger(int* n, int* count){ 
    int sum = 0; 

    for (int i = 0; i < *count; i++) 
     sum += *n; 

    return sum; 
} 

私は何が問題なのでしょうか?

あなたが &xを通過し、両方の呼び出しで
inputIntegerNumber(&x, &count); 
printf("Sum of array is %d", sumOfInteger(&x, &count)); 

が、xintの配列であり、あなたの関数がint *ない期待する - それは私の考えている...

+2

'* count ++;' - > '(* count)++;' C *演算子の優先順位を参照してください。 –

+1

このような質問をするときは、あなたの入力、予想される出力、実際の出力は何ですか?*非常に明確に定義してください。 – deniss

+2

コンパイラの警告をオンにします。コンパイラは間違っていることのいくつかを教えてくれます。間違っているもう一つのことは、最初の配列要素以外の配列要素に決してアクセスしないことです。 –

答えて

1

のようないくつかの問題がありますが、私に同じ結果を与えるものではありませんint (*)[]。少なくともこれはエラーを与えているに違いありません。両方の機能のために

あなただけの直接配列xを渡すことができます。

そして、あなたの機能でinputIntegerNumberこの -

*count++; 

あなたはcountの値をインクリメントする必要があるので、それは(*count)++する必要があります。最初に参照解除してから、値を増やしてください。

1

ポインタにポインタを渡すようないくつかの間違いをしています(配列は基本的にはメモリ位置のポインタなので)。同じ場所を何度も上書きしています。 scanf("%d", a);では、入力ループ内でaを変更せずに最初の場所を何度も上書きしています。配列とその使用方法について学ぶ必要があります。 sumOfIntegerでも、nの値は変更されていません。私は少しコードを変更し、私は希望の出力を見ることができた。

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

const int MAX_ITEMS = 50; 
void inputIntegerNumber(int* a, int* count); 
int sumOfInteger(int* n, int* count); 

int main(int argc, char** argv) { 
    int x[MAX_ITEMS], count = 0; // zero elements in array 

    inputIntegerNumber(x, &count); 
    printf("Sum of array is %d", sumOfInteger(x, &count)); 

    return (EXIT_SUCCESS); 
} 

void inputIntegerNumber(int* a, int* count){ 
    int aIndex = 0; 
    do{ 
     printf("Please! input numbers: "); 
     scanf("%d", &a[aIndex]); 
     aIndex++; 
    }while((a[aIndex-1] != 0) && (aIndex != MAX_ITEMS)); 

    *count = aIndex; 
} 

int sumOfInteger(int* n, int* count){ 
    int sum = 0; 

    for (int i = 0; i < *count; i++) 
     sum += n[i]; 

    return sum; 
} 

私はそれを実行したとき、私は見ることができます:

~/Documents/src : $ ./a.out 
    Please! input numbers: 1 
    Please! input numbers: 2 
    Please! input numbers: 3 
    Please! input numbers: 0 
    Sum of array is 6 
0

あなたは物事を過度に複雑です。あなたがプログラムを書くために座る前に、必ず

  • 合計を計算int型に変換し、メモリ
  • に保存

    • は、コマンドラインから番号を読むに行われなければならない一般的な手順を記述し
    • 印刷、それをここで

    が改訂プログラム

    #include <stdio.h> 
    #include <stdlib.h> /* for strtol */ 
    
    #define DIE(msg) fprintf(stderr, "%s", msg); exit(EXIT_FAILURE) 
    
    int main(int argc, char *argv[]) 
    { 
        int *nums; 
    
        if (argc <= 1) 
         DIE("Usage: [int-list]\n"); 
    
        /* skip program name */ 
        --argc; 
        ++argv; 
    
        nums = malloc(argc * sizeof(int)); 
        if (!nums) 
         DIE("Out of mem\n"); 
    
        for (int i = 0; i < argc; ++i) { 
         char *end; 
         double val = strtol(argv[i], &end, 0); 
    
         if (end == argv[i]) /* no digits detected */ 
          DIE("Usage: [int-list]\n"); 
    
         nums[i] = val; 
        } 
        printf("%d\n", add(nums, argc)); 
    
        free(nums); 
    } 
    int add(int arr[], size_t n) 
    { 
        int sum = 0; 
    
        for (int i = 0; i < n; ++i) 
         sum += arr[i]; 
    
        return sum; 
    } 
    
    0123です

    strtolエラー処理を完了するには、OPの練習です。

  • 関連する問題