knb-nkmのプロフィール
- ベストアンサー数
- 4
- ベストアンサー率
- 66%
- お礼率
- 0%
- 登録日2010/08/05
- localtime() 関数についての質問
C言語の勉強をして間もない者です。 time_t = current; struct tm = *local; time(¤t); local = localtime(¤t); こんなのがlocaltime関数を使った一般的なプログラムだと思いますが、なぜlocaltimeの引数がcurrentのポインタなのでしょうか? 別にcurrentには値を代入しないのだから、localtime(current)でもいいとおもうのですが、ポインタにした必然的理由があるのでしょうか?
- localtime() 関数についての質問
C言語の勉強をして間もない者です。 time_t = current; struct tm = *local; time(¤t); local = localtime(¤t); こんなのがlocaltime関数を使った一般的なプログラムだと思いますが、なぜlocaltimeの引数がcurrentのポインタなのでしょうか? 別にcurrentには値を代入しないのだから、localtime(current)でもいいとおもうのですが、ポインタにした必然的理由があるのでしょうか?
- 2次元配列からダブルポインタへの合わせ方
固定要素数の行列の処理ですが、subでセグメントエラーを起こしています。 アドレスを出力してみると、subでは元々確保したアドレスでは無いところを指しています。 呼び出し側では「行列の先頭のアドレス」を明示したつもりだったのですが、どこが間違っているのでしょうか。少し長いですが、ソースコードと出力を示します。 typedefのところとsubのIFは変更できないので、double[3][3]とdouble** のIFを合わせないといけないのですが、合わせ方がよくわかりません。 よろしくお願いします。 ========================================= #include <stdio.h> #include <string.h> typedef double Matrix[3][3]; void sub( const double** mat ); int main(void) { int ret = 0; int i, j; Matrix mat = { { 0., 1., 2. }, { 3., 4., 5. }, { 6., 7., 8. } }; for( i = 0; i < 3; i++ ){ for( j = 0; j < 3; j++ ){ printf( "main : mat[%d][%d] = %f\n", i, j, mat[i][j] ); printf( "main : &mat[%d][%d] = %p\n", i, j, &mat[i][j] ); } } printf( "\n" ); sub( &mat[0][0] ); return ret; } void sub( const double** mat ) { int i, j; printf("---- &mat = %p\n", &mat ); for( i = 0; i < 3; i++ ){ for( j = 0; j < 3; j++ ){ printf( "sub : mat[%d][%d] = %f\n", i, j, mat[i][j] ); printf( "sub : &mat[%d][%d] = %p\n", i, j, &mat[i][j] ); } } printf( "\n" ); } ========================================= main : mat[0][0] = 0.000000 main : &mat[0][0] = 0x7ffffca7bca0 main : mat[0][1] = 1.000000 main : &mat[0][1] = 0x7ffffca7bca8 main : mat[0][2] = 2.000000 main : &mat[0][2] = 0x7ffffca7bcb0 main : mat[1][0] = 3.000000 main : &mat[1][0] = 0x7ffffca7bcb8 main : mat[1][1] = 4.000000 main : &mat[1][1] = 0x7ffffca7bcc0 main : mat[1][2] = 5.000000 main : &mat[1][2] = 0x7ffffca7bcc8 main : mat[2][0] = 6.000000 main : &mat[2][0] = 0x7ffffca7bcd0 main : mat[2][1] = 7.000000 main : &mat[2][1] = 0x7ffffca7bcd8 main : mat[2][2] = 8.000000 main : &mat[2][2] = 0x7ffffca7bce0 ---- &mat = 0x7ffffca7bc68 セグメンテーション違反です
- 2次元配列からダブルポインタへの合わせ方
固定要素数の行列の処理ですが、subでセグメントエラーを起こしています。 アドレスを出力してみると、subでは元々確保したアドレスでは無いところを指しています。 呼び出し側では「行列の先頭のアドレス」を明示したつもりだったのですが、どこが間違っているのでしょうか。少し長いですが、ソースコードと出力を示します。 typedefのところとsubのIFは変更できないので、double[3][3]とdouble** のIFを合わせないといけないのですが、合わせ方がよくわかりません。 よろしくお願いします。 ========================================= #include <stdio.h> #include <string.h> typedef double Matrix[3][3]; void sub( const double** mat ); int main(void) { int ret = 0; int i, j; Matrix mat = { { 0., 1., 2. }, { 3., 4., 5. }, { 6., 7., 8. } }; for( i = 0; i < 3; i++ ){ for( j = 0; j < 3; j++ ){ printf( "main : mat[%d][%d] = %f\n", i, j, mat[i][j] ); printf( "main : &mat[%d][%d] = %p\n", i, j, &mat[i][j] ); } } printf( "\n" ); sub( &mat[0][0] ); return ret; } void sub( const double** mat ) { int i, j; printf("---- &mat = %p\n", &mat ); for( i = 0; i < 3; i++ ){ for( j = 0; j < 3; j++ ){ printf( "sub : mat[%d][%d] = %f\n", i, j, mat[i][j] ); printf( "sub : &mat[%d][%d] = %p\n", i, j, &mat[i][j] ); } } printf( "\n" ); } ========================================= main : mat[0][0] = 0.000000 main : &mat[0][0] = 0x7ffffca7bca0 main : mat[0][1] = 1.000000 main : &mat[0][1] = 0x7ffffca7bca8 main : mat[0][2] = 2.000000 main : &mat[0][2] = 0x7ffffca7bcb0 main : mat[1][0] = 3.000000 main : &mat[1][0] = 0x7ffffca7bcb8 main : mat[1][1] = 4.000000 main : &mat[1][1] = 0x7ffffca7bcc0 main : mat[1][2] = 5.000000 main : &mat[1][2] = 0x7ffffca7bcc8 main : mat[2][0] = 6.000000 main : &mat[2][0] = 0x7ffffca7bcd0 main : mat[2][1] = 7.000000 main : &mat[2][1] = 0x7ffffca7bcd8 main : mat[2][2] = 8.000000 main : &mat[2][2] = 0x7ffffca7bce0 ---- &mat = 0x7ffffca7bc68 セグメンテーション違反です
- 教えていただけませんか?C言語 文字列について
学校で文字列のプログラムを組む課題が出ました 以下のような課題です 1つの文字列を読み込んで,ピリオドで改行し出力するプログラムを作成しろ ・読み込む文字列の長さ 最大で80文字 ・文字列の終わりは必ずピリオドで ・文字列の途中に現れるピリオドの次には必ずスペースが続く ・ピリオドに続くスペースは出力しない 例えば Hello. It is fine. Good-bye. と打つと Hello. It is fine. Good-bye. と表示されるようなプログラムです そして自分で以下のプログラムを組みました ----------------------------------------------------------- #include <stdio.h> #include <string.h> int main(void){ int i; char A[100]; char *a; fgets(A,80,stdin); a = strtok(A, "."); printf("%s.\n",a); while(a != NULL){ a = strtok(NULL,"."); if (a != NULL){ printf("%s.\n",a); } } return 0; } --------------------------------------------------------------- ですがこれだとピリオドの後のスペースと文字列の後によくわからない改行が出力されてしまいます 自分で何とかするべきなのでしょうがどうにもうまく行きません どこをどうすればいいのか教えていただけないでしょうか?