2017-01-12 19 views
2

私はC言語では少し新しく、ポインタと逆参照を使用して関数の引数にアクセスする方法についていくつか理解したいと思います。C strtolを使用した文字列関数の引数の解析

私のコードですが、プログラムの全ポイントは、空白で区切られた2桁の数字で特定のパラメータを解析するのに、strtolを使用することです。

int sum(const char *input){ 
    char *input = input_line; // dereference the address passed into the function to access the string 
    int i; // store sum in here 
    char *rest; // used as second argument in strtol so that first int can be added to i 
    i = strtol(input, &rest, 10); // set first int in string to i 
    i += strtol(rest, &rest, 10); // add first and second int 
    return i; 
} 

私は、文字列は変数名で*を持っているので、与えられた文字列パラメータにアクセスする方法を困惑している、と私はそれを回避する方法があまりにもわかりません。

とにかく、ありがとう。

+1

'strtol()'を正しく使う方法については、 '' strtol() 'の正しい使い方」(http://stackoverflow.com/questions/14176123/correct-usage-of-strtol)を参照してください。 。あなたの現在の問題はより平凡です。関数の本体のトップレベルでパラメータ( 'input')を再定義することができないため、コードはコンパイルされません。おそらく、 'input_line'ではなく' input_line'パラメータに名前を付けることに気付いたでしょう。 –

答えて

3

入力パラメータを逆参照する必要はありません。行を単にドロップするだけであれば、コードはうまく機能しません。 sumcharへのポインタを渡しています。これは、正確にはstrolの最初の引数になります。

簡単なテスト:

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

int sum(const char *input){ 
    int i; // store sum in here 
    char *rest; // used as second argument in strtol so that first int can be added to i 
    i = strtol(input, &rest, 10); // set first int in string to i 
    i += strtol(rest, &rest, 10); // add first and second int 
    return i; 
} 

int main(void){ 
    char* nums = "23 42"; 
    printf("%d\n",sum(nums)); 
    return 0; 
} 

期待どおりに印刷65

限り行く逆参照の仕組みとして:もしあなたが本当にポインタがsumに渡された参照を解除します(sum内側)このようなものだろうしたかったいくつかの理由のために:

char ch; // dereferencing a char* yields a char 
ch = *input; // * is the dereference operator 

今すぐchを開催すると入力文字列の最初の文字。個々に渡す理由は全くありません。そのため、このような逆参照はこの場合は無意味です。もちろん、その関数に渡されるポインタを逆参照する関数の本体には妥当な理由があります。

関連する問題