マンガでよめる痔のこと・薬のこと

C言語で下の3次元配列をmain関数から関数funcに渡したいんですけどどうすればいいですか?



関数定義時の引数の型はポインタ表記で
そしてfuncの中で受け取った配列要素の値を表示するプログラムを作りたいです。

なんか分かりづらくてすいません!!!

int main (void) {

int a[3][3][3] = {
{{1, 2, 3},
{4, 5, 6},
{7, 8, 9},

{{10, 11, 12},
{13, 14, 15},
{16, 17, 18},

{{19, 20,21},
{22, 23, 24},
{25, 26, 27},



A 回答 (1件)

func の引数にすればいいと思うよ.

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QC言語のポインタ関数について main関数のなかで &をつけてc=0 a=1 b=2として sum3

C言語のポインタ関数について
main関数のなかで
&をつけてc=0
a=1
b=2として
sum3関数に飛ばします。

void sum3(int a, int b, int *c)
{
*c = a + b;
}

通常*をつけないと
mainでprintでひょうじしても
3になりませんが
*つけると
3と表示できます。
なぜでしょうか?

またreturnがいらない理由も教えてください。

Aベストアンサー

a、bは「値渡し」であって、sum2の中で値を変えても、呼び出し元には反映されません。
cに"*"をつけて「アドレス渡し」とすることで、sum2の中で変更した値が呼び出し元の変数に反映されるようになります。

このあたりのことは、作ったC言語のソースを実行形式ではなくて、コンパイルオプションを指定して、アセンブラー言語で表示させてみるとよくわかると思います。
C言語のポインタを理解するには、アセンブラ言語の勉強をするのが一番効果があります。

なお、アセンブラはCPUによって違いがあったりします。
私が勉強したころは、CPUがまだ8ビットで、68系(モトローラ系)、80系(インテル系)とか、あるいは、IBMのS/370汎用機とかだったのですけど、どれか1つのアセンブラを勉強すれば、いいと思います。

QC言語の関数の中身のソースコードについて

rdtsc関数を現在使っています。

タイムスタンプカウンタの値を出力することができる関数なのですが、
具体的にどのような処理をするのかソースコードを確認したいです。

確認する方法はあるでしょうか?

Aベストアンサー

一般的には標準ライブラリ関数のソースコードが提供されているかどうかは処理系(コンパイラ)によります。GCCとかGPLに従ったものならソースコードも入手できると思いますけど。
ただrdtsc関数に関して言えばIA-32命令セットのRDTSC命令をラップしているだけと思われますので、ヘッダファイルにインラインアセンブラで記述されている可能性もあります。

QC言語のものなのですが、具体的にこの文がなにをしているかについてわからないので説明をお願いいたします

C言語のものなのですが、具体的にこの文がなにをしているかについてわからないので説明をお願いいたします。

Aベストアンサー

画像じゃなく、テキストで貼ってほしいところですが…。
で、掲示されている範囲ではs_copy()とs_reverse()の仕様が不明です。
# まぁ、名前からだいたい想像は付きますけども。

ということで、下記のページをどうぞ。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13182921508

QC言語のポインタの価値

下名は、プログラムの完全な素人ではないのですが、

C言語の初心者が、ポインタがわかりにくいということがよくあると思います。
例えば、pythonや他の言語では、ポインタはなかったと思います。

C言語において、ポインタは、必須だったのでしょうか?
それとも、単に、配列ぐらいあれば、言語として、問題なかったのでしょうか?
C言語が、ポインタの機能で何を実現できているのか、理解を深めたく。

Aベストアンサー

> C言語が、ポインタの機能で何を実現できているのか

データをコピーする手間を無くすことができます。
例えば要素の合計を求める関数を作って、その引数として要素100個の配列を渡すとしましょう。
関数の実行時には一時的にメモリ上に必要な作業エリアを確保します。
ポインタが無い場合は、作業エリアに要素100個を全てコピーしてきて、それを元に計算を始めます。
でもポインタがある場合は、元々の配列のアドレスだけをコピーしてきて、そのアドレスを進めながらアドレス先のデータを取得するという動作で計算を進めることができます。
データが1000個、10000個だったら、コピーする手間が更に余計にかかりますよね?


> C言語において、ポインタは、必須だったのでしょうか?

C言語はアセンブリ言語の面倒くささを改善するために作成されました。
アセンブリ言語でのプログラムを経験されればお分かりになると思いますがアクセスするメモリのアドレスを決定するのに「間接アドレッシング」が多用されます、これがポインタそのものなんですよね。
従ってアセンブリ言語の延長として開発されたC言語にはポインタ機能は当然存在すべきものだったと思います。


> 例えば、pythonや他の言語では、ポインタはなかったと思います。

他の方も仰っていますが見えなくなっているだけでポインタは存在します。
例えばPythonでインスタンスを宣言した場合の

 p = MyClass()

このpはポインタそのものです。
ただ、ポインタであることを意識しなくても良いように考えられているだけなんですよね。


> C言語の初心者が、ポインタがわかりにくいということがよくあると思います。

これはC言語でのポインタの記述の仕方が分かりにくいというのも多分にあると思います。
当初は「分かっている人」だけが使う為に設計された言語ですから、あまり考慮されなかったのですね。
ですから後に続く言語は、ポインタを意識しなくても良い様になったのではないでしょうか?

> C言語が、ポインタの機能で何を実現できているのか

データをコピーする手間を無くすことができます。
例えば要素の合計を求める関数を作って、その引数として要素100個の配列を渡すとしましょう。
関数の実行時には一時的にメモリ上に必要な作業エリアを確保します。
ポインタが無い場合は、作業エリアに要素100個を全てコピーしてきて、それを元に計算を始めます。
でもポインタがある場合は、元々の配列のアドレスだけをコピーしてきて、そのアドレスを進めながらアドレス先のデータを取得するという動作で計...続きを読む

Q構造体の勉強をしているのですが1と2は同じなのでしょうか?違うのでしょうか? もし違うならなぜ違うの

構造体の勉強をしているのですが1と2は同じなのでしょうか?違うのでしょうか?
もし違うならなぜ違うのか説明してください‼︎
よろしくお願いします。

1.typedef struct roll{メンバー};

2.typedef struct {メンバー}roll;

Aベストアンサー

「struct の直後に来るのが型でメンバーの後に来るのが新しい構造体の名前」の「型」と「構造体の名前」の違いってなんだろ.

さておき, これは typedef の仕様との関係がありますねぇ.

まず構造体の定義を完全に書くと
struct 構造体タグ メンバー定義 宣言子;
という形になります. ここで構造体タグは識別子, メンバー定義は
{ メンバーの宣言 }
という形で宣言子は変数やら配列やらポインタやらを表します. struct 以外は省略可能なのですが, 実際に意味を持つのは
・宣言子を省略する: 「struct 構造体タグ」で表される新しい構造体を定義する
・メンバー定義を省略する: 「struct 構造体タグ」で表される構造体型の変数などを宣言する
・構造体タグを省略する: 構造体タグがなんらかの理由で不要なときにはこの形式もあります
・メンバー定義と宣言子を省略する: 「struct 構造体タグ」で表される構造体型があることを宣言する
の 4つに限られます (全部省略しちゃダメなのは明らかだと思うけど). 再度確認しておくと, 「struct 構造体タグ」で 1つの型を表します.

質問文にある 2つの文を (typedef を除いて) 解釈するとそれぞれ
1. 宣言子を省略している. roll が構造体タグで, 「struct roll」という型を定義する
2. 構造体タグを省略している. roll は宣言子で, この場合は roll という変数を宣言する
となります. そして, *typedef がなければ*どちらも合法です (ただし, 当然ですが意味は違います).

で typedef の影響が出ます. typedef は
宣言子に含まれる識別子に対し, 「typedef がなければ与えられるはずの型」の別名として定義する
という働きをもちます. 例えば
int FOO, *Bar;
だと
・FOO は int型の変数
・Bar は int へのポインタ型の変数
なので, ここに typedef を付けた
typedef int FOO, *Bar;
では
・FOO は int型の別名
・Bar は int へのポインタ型の別名
となります. このように typedef では「別名を定義する」都合上, 宣言子はどうしても必須となります. 従って, 宣言子が省略された 1 はダメということになります.

「struct の直後に来るのが型でメンバーの後に来るのが新しい構造体の名前」の「型」と「構造体の名前」の違いってなんだろ.

さておき, これは typedef の仕様との関係がありますねぇ.

まず構造体の定義を完全に書くと
struct 構造体タグ メンバー定義 宣言子;
という形になります. ここで構造体タグは識別子, メンバー定義は
{ メンバーの宣言 }
という形で宣言子は変数やら配列やらポインタやらを表します. struct 以外は省略可能なのですが, 実際に意味を持つのは
・宣言子を省略する: 「struct 構造体タグ」...続きを読む

QC言語でエラーの直し方が分かりません。

x_i = cos ((PI*(2*i-1))/( 2*N )) i =1,2,...,N   (見づらくてすみません)

という式を計算して、結果を出力したいのですが、コンパイルできません。
自分で書いてみたプログラムとエラーを書いておくので、どこを直せばいいか教えてください。

#include <stdio.h>
#include <math.h>

#define PI 3.1415926535

double x_i(int i, int N)
{
for (i = 1 ; i <= N ; i++) {
x_i(i, N) = cos ((PI*(2*i-1))/( 2*N ));

}
}

int main()
{
int i, N ;
printf("N= ");
scanf("%d", &N);
for (i = 1 ; i <= N ; i++) {

printf("x[%2d] = %f\n",i, x_i(i,N));

}

return 0 ;
}


C:\Users>gcc nnn.c
nnn.c: In function 'x_i':
nnn.c:9:16: error: lvalue required as left operand of assignment
x_i(i, N) = cos ((PI*(2*i-1))/( 2*N ));
^


初心者なのでできれば丁寧に教えていただけると助かります。
よろしくお願いします。
結果は、
C:\Users>a
N = 5
x[ 1] = 0.951057
x[ 2] = 0.587785
x[ 3] = 0.000000
x[ 4] = -0.587785
x[ 5] = -0.951057

という風にしたいです。

x_i = cos ((PI*(2*i-1))/( 2*N )) i =1,2,...,N   (見づらくてすみません)

という式を計算して、結果を出力したいのですが、コンパイルできません。
自分で書いてみたプログラムとエラーを書いておくので、どこを直せばいいか教えてください。

#include <stdio.h>
#include <math.h>

#define PI 3.1415926535

double x_i(int i, int N)
{
for (i = 1 ; i <= N ; i++) {
x_i(i, N) = cos ((PI*(2*i-1))/( 2*N ));

}
}

int main()
{
int i,...続きを読む

Aベストアンサー

>以下のプログラムで正常に動いたので、これを関数に変えればいいと思っていたのですが、うまくいかず質問させていただいてるという流れです。

・ループはコール側でやっているので関数内でやる必要はない。
・ループで結果を表示しているので配列は関係ない。
ということで…

>double x_i(int i, int N)
>{
> for (i = 1 ; i <= N ; i++) {
>  x_i(i, N) = cos ((PI*(2*i-1))/( 2*N ));
> }
>}

は、
double x_i(int i, int N)
{
 return cos ((PI*(2*i-1))/( 2*N ));
}
になるだけなんじゃないですかね?


>int i[20];   //配列の指定の大きさ
>int N[20];
で、関数の方は
>double x_i(int i, int N)
で、コールは
>printf("x[%2d] = %f\n",i, x_i(i,N));

コールする時の第1引数と第2引数は配列を渡していますが、関数の仮引数の方と一致しません。
ということで、コンパイルエラーでしょう。

>x_i(i, N) = cos ((PI*(2*i-1))/( 2*N ));

既に指摘していますし、他の方からも回答ありますが、関数コールに対して値の代入はできません。
ので、こちらもコンパイルエラーでしょう。


>Nは5と決まっているわけではなくて、20までで自分で、自由に決めれるようにしたいです。

>printf("i = ");
>scanf("%d", &N);

iなのかNなのか不明ですが…
規定の範囲の値が入力されるまでループするようにすればよいかと。

do {
 printf("i = ");
 scanf("%d", &N);
} while((N < 0) || (N > 20));
とか?
# scanf()でのエラー処理していませんが。(数字以外を入力すると無限ループに堕ちるとか)

>以下のプログラムで正常に動いたので、これを関数に変えればいいと思っていたのですが、うまくいかず質問させていただいてるという流れです。

・ループはコール側でやっているので関数内でやる必要はない。
・ループで結果を表示しているので配列は関係ない。
ということで…

>double x_i(int i, int N)
>{
> for (i = 1 ; i <= N ; i++) {
>  x_i(i, N) = cos ((PI*(2*i-1))/( 2*N ));
> }
>}

は、
double x_i(int i, int N)
{
 return cos ((PI*(2*i-1))/( 2*N ));
}
になるだけなんじゃないですかね?
...続きを読む

QC言語、関数を用いたプログラムがうまくいきません。

C言語で、以下の漸化式について
T(0)=1
T(1)=X             のとき

T(k+1)=2XT(k)-T(k-1)    (k = 0,1,2...,20)
を、kを20以下の自分の好きな値を入力して、計算を回して出力するプログラムを以前作りました。


以下にプログラムの内容と結果を書きます。
#include <stdio.h>
#include <math.h>

int main()
{
double x ;
int k ;
int K ;
double T[20] ;

printf("k = ") ;
scanf("%d", &K) ;

printf("x = ") ;
scanf("%lf", &x) ;

T[0] = 1 ;
T[1] = x ;

for (k = 1; k < K; k++) {
T[k+1] = 2 * x * T[k] - T[k - 1];
}

for (k = 0; k <= K; k++) {
printf("T[%2d] = %f\n",k,T[k]);
}
return 0 ;
}

//結果//
k = 5
x = 2
T[ 0] = 1.000000
T[ 1] = 2.000000
T[ 2] = 7.000000
T[ 3] = 26.000000
T[ 4] = 97.000000
T[ 5] = 362.000000

k = 4
x = 3
T[ 0] = 1.000000
T[ 1] = 3.000000
T[ 2] = 17.000000
T[ 3] = 99.000000
T[ 4] = 577.000000


今回は上記のプログラムを、関数を使って作りました。
以下にプログラムの内容と結果を書きます。


#include <stdio.h>
#include <math.h>

double t[20];

double T(double x, int k)
{
if (k = 0)
{
return 1 ;
}

if (k = 1)
{
return x ;
}

else
{
return 2 * x * t[k] - t[k - 1];
}

}

int main()
{
double x ;
int k, K ;
double t[20];

printf("k = ") ;
scanf("%d", &K) ;

printf("x = ") ;
scanf("%lf", &x) ;

for (k = 0; k <= K; k++)
{
printf("T[%2d] = %lf\n",k,T(x,k));
}
return 0;
}


//結果//
k = 5
x = 2
T[ 0] = 2.000000
T[ 1] = 2.000000
T[ 2] = 2.000000
T[ 3] = 2.000000
T[ 4] = 2.000000
T[ 5] = 2.000000

k = 4
x = 3
T[ 0] = 3.000000
T[ 1] = 3.000000
T[ 2] = 3.000000
T[ 3] = 3.000000
T[ 4] = 3.000000


このように、計算がうまくいきません。
何を直せばうまくいくかなど教えていただけると嬉しいです。
また、C言語、プログラミング初心者なので、わかりやすく丁寧に教えていただけると助かります。
よろしくお願いします。

C言語で、以下の漸化式について
T(0)=1
T(1)=X             のとき

T(k+1)=2XT(k)-T(k-1)    (k = 0,1,2...,20)
を、kを20以下の自分の好きな値を入力して、計算を回して出力するプログラムを以前作りました。


以下にプログラムの内容と結果を書きます。
#include <stdio.h>
#include <math.h>

int main()
{
double x ;
int k ;
int K ;
double T[20] ;

printf("k = ") ;
scanf("%d", &K) ;

printf("x = ") ;
scanf("%lf", &x) ;

T[0] = 1 ;
...続きを読む

Aベストアンサー

C言語における比較演算子は"=="
"="は代入演算子。
if文の()の中が全て"="になっていますね。これを全て"=="に変えましょう。

if(k=0)
はkに0を代入。そしてその代入した値がその式の値として評価されます。
つまり、k=0は偽として処理される。(C言語において式の値が"0"=偽)
kの値はこの時点で"0"になっている。

if(k=1)
kに1が代入される。そしてその式の値は"1"であり真(C言語において式の値が"0"以外=真)
真であるため、ifの後の{}中の式が実行される。return文なのでここでこの関数は終了される。
要するにxの値がそのまま出力される。
当然それ以下の式は実行されない。

Q16進数ダンプリスト中の32ビットのデータの変換の考え方

ある数値データの入ったバイナリファイルのダンプリストの先頭の4バイト(32ビット)データが、ファイルの先頭方向から

6D A3 17 85

となっています。

このデータは、MSBASIC単精度浮動小数点型式(32ビット)であることが分かっています。そのデータ形式は、次のようなものであることも調べました。

31-24ビット:e(指数部)
23ビット:s(符号)
22-0ビット:f(仮数部)

"数値:(-1)^s × 2^(e-129) × (1.f)"

1バイトごとに「16進数→2進数」の変換を、手計算でやってみると、次のようになりました。

6D → 0110 1101
A3 → 1010 0011
17 → 0001 0111
85 → 1000 0101

なので、この32ビットのデータを、上位ビットから2進数で書くと、次のようになると思います。

1000 0101 0001 0111 1010 0011 0110 1101

これを、指数部・符号・仮数部に対応させると、次のようになると思います。

指数部:1000 0101
符号:0
仮数部:001 0111 1010 0011 0110 1101

ここまでで、仮数部のみ2進数表現として、指数部と符号を10進数表現にすると、次のようになると思います。

(-1)^(0) × 2^(133-129)(以上10進数、以下2進数) × (1.001 0111 1010 0011 0110 1101)

このデータは、ある分光分析による波形データで、単位はパーセント、すなわち、通常は0と100の間の値を取ります。上の10進数の指数部と仮数部は、

(-1)^(0) × 2^(133-129)
=1 × 2^4
=16

となります。仮数部は、1と2の間の値を取るであろうと思われますので、このデータは、16から32程度の値と、ほぼ妥当な推測だと思います。

これを、C言語で自動で計算できるようにしたいのですが、そのソースはどのようになるでしょうか。

2番目のデータは、(32 2D 18 85)(16進)、3番目のデータは(D7 0C 18 85)(16進)です。なので、

(6D A3 17 85)(16進) → ?(10進)
(32 2D 18 85)(16進) → ?(10進)
(D7 0C 18 85)(16進) → ?(10進)


と、計算を自動化したいのですが、考え方と、できればソースの例としてどのようになるか、ご教授頂きたく、お願い致します。

ある数値データの入ったバイナリファイルのダンプリストの先頭の4バイト(32ビット)データが、ファイルの先頭方向から

6D A3 17 85

となっています。

このデータは、MSBASIC単精度浮動小数点型式(32ビット)であることが分かっています。そのデータ形式は、次のようなものであることも調べました。

31-24ビット:e(指数部)
23ビット:s(符号)
22-0ビット:f(仮数部)

"数値:(-1)^s × 2^(e-129) × (1.f)"

1バイトごとに「16進数→2進数」の変換を、手計算でやってみると、次のようになりました。
...続きを読む

Aベストアンサー

こんな感じでどうでしょうか。

※データの変換が正確かはご自身で検証をお願いします。
※実行時、対象バイナリファイル名を引数にしてください。
※バイナリファイルは4の倍数バイト長を前提としていますので最後に端数があれば読み捨てます。
※諸々エラー処理を行っていないので必要に応じて追加してください。


実行内容(Windows環境下のgcc)
C:\test>gcc -o test.exe test.c
C:\test>test.exe data.bin
6D A3 17 85 -> 18.954798
32 2D 18 85 -> 19.022068
D7 0C 18 85 -> 19.006269



-----test.c
#include <stdio.h>
#include <math.h>

#define SIZE 4

double convert(unsigned char *d){
int e,s;
int m;

//指数部を取りだす
e = d[3] - 129;

//符号を確認し、1(正) か -1(負)を決める
s = (0x80 & d[2]) ? -1 : 1;

//仮数部22-0bitを取り出し23bit目に1を追加
m = ((d[2] & 0x7f)<<16) | (d[1]<<8) | d[0] | 0x800000;

//仮数部mを2^23で割り1.xxxxの値にする、その後2^(指数部の値)を掛け
//更に符号をつける
return m * pow(2, e - 23) * s;
}

int main(int argc, char *argv[]){
FILE *fp;
unsigned char data[SIZE];
int i;

fp = fopen( argv[1], "rb" );
while( fread(data, sizeof(unsigned char), SIZE, fp) == SIZE ){
for(i = 0; i < SIZE; i++) printf("%02X ", data[i]);
printf( "-> %f\n", convert(data) );
}
return 0;
}
-----

こんな感じでどうでしょうか。

※データの変換が正確かはご自身で検証をお願いします。
※実行時、対象バイナリファイル名を引数にしてください。
※バイナリファイルは4の倍数バイト長を前提としていますので最後に端数があれば読み捨てます。
※諸々エラー処理を行っていないので必要に応じて追加してください。


実行内容(Windows環境下のgcc)
C:\test>gcc -o test.exe test.c
C:\test>test.exe data.bin
6D A3 17 85 -> 18.954798
32 2D 18 85 -> 19.022068
D7 0C 18 85 -> 19.006269



-----test.c
#include...続きを読む

Q問題がで書きで申し訳ないのですが、基本課題1ー1で、要素数sizeとは要素数をscanfを使って代入

問題がで書きで申し訳ないのですが、基本課題1ー1で、要素数sizeとは要素数をscanfを使って代入するということですか?またその時、要素の数はどうすれば良いですか?全然わからないので教えていただけませんか?
また、可能ならばコードを書いてもらえたら嬉しいです。

Aベストアンサー

要素数sizeの整数型配列名が問題文にかかれていないので、これをtと置くと、

void f( int t[], int size, int a)
{
 int i;
 for(i=0; i<size; i++)
  t[i] *= a;
}

てな感じでしょうか。

QC言語、このコードを実行したいです。

main関数がないと言われます。
どこに追加すれば良いのかわかりません。
ご教授願います。


#include <stdio.h>
#include <ctype.h>
void find_palindrome(const char*);
int is_palindrome(const char*, int);
const char* find_char(const char*, char);
void find_palindrome(const char* text){
int i;
int psize;
const char* ith;
const char* hit;
for (i = 0; text[i] != '\0'; i++) {
if(!isalnum(text[i])) {
continue;
}
ith = &text[i];
hit = find_char(ith + 1, *ith);
while (hit != NULL) {
psize = hit - ith + 1;
if (is_palindrome(ith, psize)) {
while (ith < hit + 1) {
putchar(*ith);
ith++;
}
putchar('\n');
return;
}
hit = find_char(hit + 1, *ith);
}
}
}
int is_palindrome(const char* chars, int size){
int l;
int r;
for (l = 0, r = size - 1; l < r; l++, r--){
while (!isalnum(chars[l])) {
l++;
}
while (!isalnum(chars[r])) {
r--;
}
if(tolower(chars[l]) == tolower(chars[r])) {
return 0;
}
}
return 1;
}
const char* find_char(const char* str, char ch) {
int i;
for (i = 0; str[i] != '\0'; i++) {
if(tolower(ch) == tolower(str[i])){
return &str[i];
}
}
return NULL;
}

main関数がないと言われます。
どこに追加すれば良いのかわかりません。
ご教授願います。


#include <stdio.h>
#include <ctype.h>
void find_palindrome(const char*);
int is_palindrome(const char*, int);
const char* find_char(const char*, char);
void find_palindrome(const char* text){
int i;
int psize;
const char* ith;
const char* hit;
for (i = 0; text[i] != '\0'; i++) {
if(!isalnum(text[i])) {
continue;
}
ith = &text[i];
hit =...続きを読む

Aベストアンサー

このプログラムがどんなプログラムなのか説明がないのでわかりませんが、
とりあえず、mainを追加してエラーにならないようにしました。
業務的に意味のある結果が得られているかどうかはわかりませんが・・・・・。
-------------------------------
#include <stdio.h>
#include <ctype.h>
void find_palindrome(const char *);
int is_palindrome(const char *, int);
const char *find_char(const char *, char);
void find_palindrome(const char *text)
{
int i;
int psize;
const char *ith;
const char *hit;
for (i = 0; text[i] != '\0'; i++) {
if (!isalnum(text[i])) {
continue;
}
ith = &text[i];
hit = find_char(ith + 1, *ith);
while (hit != NULL) {
psize = hit - ith + 1;
if (is_palindrome(ith, psize)) {
while (ith < hit + 1) {
putchar(*ith);
ith++;
}
putchar('\n');
return;
}
hit = find_char(hit + 1, *ith);
}
}
}
int is_palindrome(const char *chars, int size)
{
int l;
int r;
for (l = 0, r = size - 1; l < r; l++, r--) {
while (!isalnum(chars[l])) {
l++;
}
while (!isalnum(chars[r])) {
r--;
}
if (tolower(chars[l]) == tolower(chars[r])) {
return 0;
}
}
return 1;
}
const char *find_char(const char *str, char ch)
{
int i;
for (i = 0; str[i] != '\0'; i++) {
if (tolower(ch) == tolower(str[i])) {
return &str[i];
}
}
return NULL;
}

int main()
{
find_palindrome("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
return 0;
}

このプログラムがどんなプログラムなのか説明がないのでわかりませんが、
とりあえず、mainを追加してエラーにならないようにしました。
業務的に意味のある結果が得られているかどうかはわかりませんが・・・・・。
-------------------------------
#include <stdio.h>
#include <ctype.h>
void find_palindrome(const char *);
int is_palindrome(const char *, int);
const char *find_char(const char *, char);
void find_palindrome(const char *text)
{
int i;
int psize;
const char *ith;
const cha...続きを読む


人気Q&Aランキング