- ベストアンサー
C言語のプログラム(ポインタについて)
/* コマンドライン引数で与えられた長い文字列を長さ10文字ずつに分割してp[100][11]に順番に入れ,表示するプログラム <例>./a.out 1234567890ABCDEFG p[1] = "1234567890" p[2] = "ABCDEFG" */ #include <stdio.h> int main(int argc, char **argv) { int i, len; char *str; len=0; for(i=1; i<argc; i++){ len += strlen(argv[i]); } if((str=(char *) malloc(len+1))==NULL){ perror("malloc"); exit(1); } strncpy(str,argv[1],10); for(i=2; i<argc; i++){ strcat(str,argv[i]); } printf("p[%d] = %s\n", i-1, str); } 上に示した処理をするプログラムを作成したいのですが、 今のソースは単に10文字表示するだけで、ここからどうしたらいいのか見当がつきません・・・・・。 なのでどういった改良をすればよいのか教えていただければ助かります。 /*配列aにファイルから値を読み込み、それを表示した後*/ /*配列に格納された値を下に1つずつずらして表示するプログラム(ポインタを使用して)を作成*/ /*(なお、一番上a[0]にはa[99]の値を入れる)*/ /*<例>*/ /*a[0] = 0 */ /*a[1] = 1 */ /* ・ */ /* ・ */ /*a[98] = 98*/ /*a[99] = 99*/ /*a[0] = 99 */ 1つずらしたもの /*a[1] = 0 */ /* ・ */ /* ・ */ /*a[98] = 97*/ /*a[99] = 98*/ (読み込むファイル[file-100.dat]には0~99の数字が1つずつ改行しながら入っています) できればこちらにも答えていただければ嬉しいです。 この問のソースは書きませんが、ファイルを配列に読み込んで表示してからの処理がいまいちわからず困っています。 すばやい御回答お待ちしております。よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
100は、固定? char *instr = argv[1]; char p[100][11]; int n=0; len = strlen( instr ); for(;len>0;instr+=10){ memcpy( (void*)p[n], instr, len>10?10:len ); len-=10; n++; if( p>=100 )break; } 可変なら char *instr = argv[1]; char *p; char *np; int n=0; len = strlen( instr ); p=(char*)mallco(11); for(;len>0;instr+=10){ memcpy( (void*)p[n*11], instr, len>10?10:len ); len-=10; n++; np=realloc( p, (n+1)*sz); if( np!=NULL ) p = np; } ということ? 下の配列の意味が少しわからないが 配列の中身をずらしたいのかな? 一つずつずらしてポインターを使用して表示って言葉だけを見ると int n; char *p = &a[0]; for( n=0;n<100;n++ ){p++; printf("%d", p );} で0~99の中身は表示可能だけど 下の説明を見ると、a[0]にさっきまでのa[99]がはいってるから それなら char t=a[99]; memmove( &a[1], &a[0], 99 ); a[0] = t; でずらせるけど、どっちのことなのかな?
その他の回答 (2)
- yaemon_2006
- ベストアンサー率22% (50/220)
おまけ。 void q2(void) { int a[100], i, j; for(i = 0; i < 100; i ++) a[i] = i; for(i = 99; i > 0; i --){ j = a[i]; a[i] = a[i - 1]; a[i - 1] = j; } puts("q2"); for(i = 0; i < 100; i ++) printf("a[%3d] %d\n", i, a[i]); }
- yaemon_2006
- ベストアンサー率22% (50/220)
#include <stdio.h> #include <string.h> void q1(void) { char *s = "1234567890ABCDEFGHIJKLMN"; char p[100][11]; int l = strlen(s), i, j; for(i = 0; i * 10 < l; i ++, s += 10) sprintf(p[i], "%.10s", s); puts("q1"); for(j = 0; j < i; j ++) printf("p[%3d] %s\n", j, p[j]); } void q2(void) { int a[100], i; for(i = 0; i < 100; i ++) a[i] = i; puts("q2"); for(i = 0; i < 100; i ++) printf("a[%3d] %d\n", i, a[(i + 99) % 100]); } int main(void) { q1(); putchar('\n'); q2(); return 0; }
お礼
ありがとうございました。助かりました!!
お礼
ありがとうございます、助かりました!
補足
>>100は、固定? 固定です >>どっちのことなのかな? 恐らく配列をずらして格納した後、ポインタを利用してa[0]にa[99]の値を 格納するんだったと思います・・・・・。