ページ 11

文字列と配列の問題です

Posted: 2007年6月27日(水) 00:10
by がんも
ぜひ教えてください!

問題は

文字列の長さを求める関数 str_len() を作成しなさい.str_len() は,ある文字列の先頭アドレスを実引数として与えられたとき,その文字列の長さ(最後の 0 を含まない byte数)を返す関数です.例えば,

int n1, n2; static char a[/url] = "ALPHABET";

n1 = str_len(a); n2 = str_len("abcd");

とすれば n1 に 8 が,n2 に 4 がそれぞれ代入されます.なお,この関数の第1行を

unsigned int str_len(char *c)

と定めます("char *c" は "char c[/url]" としても同じです.コンパイラは,どちらも「c は char型のポインタ変数である」と解釈します).

(ヒント)for文などを用いて *(c + i) が 0 となる直前までの byte数を調べます.



関数だけ作ればいようですが、一応scanfで文字の入力する形で作ってみました。
for文の使い方がよくわからなかったので使わなかったのですが…
コンパイルはできましたがうまく作動しません。
また作ってみたものの理解してるかはあやしいです;;
ぜひアドバイスをお願いします!



#include <stdio.h>

unsigned int str_len(char *c)
{
int i = 0;
do{
i = i++;
}while( *(c + i) != 0);

return i;

}

int main(void)
{
char a[100];
unsigned int n;

printf("文字列を入力して下さい。\n");

scanf("%s",a);

n = str_len(a);

printf("文字列の長さは%uです。",n);
}

Re:文字列と配列の問題です

Posted: 2007年6月27日(水) 00:38
by がんも
すみません もうひとつ聞きたいことが。先ほどの問題の次の問題です。


加減算を表わす一行の文字列を入力した結果,その加減算を実行して計算値を出力するプログラム kagenzan.c を作りたいとします.kagenzan.c は,例えば

1234+62-32+224 [RET] ← 入力

= 1488 ← 出力

あるいは,

-26-39+14 [RET] ← 入力

= -51 ← 出力

などのように動作するプログラムです([RET] = リターンキー押下).

このような目的に使用される関数に atoi() があります(標準関数として用意されている).例えば,

char a[/url] = "1234+62-32+224"; int n;

n = atoi(a);

とすれば,n には値 1234 が代入されます.つまり atoi() は,文字列の最初に置かれた数値のみを int型に変換して出力するわけです.したがって,次は文字列 "1234" の byte数 4 を加えて n += atoi(a + 4); とすれば値 "+62" が n に加算され,さらにn += atoi(a + 7); により値 "-32" が n に加算されます.

このようにして atoi() を使用してゆけば,最後には "1234+62-32+224" の結果を得ることができます.この場合,atoi() の他に数値を表わす文字列の長さを求める関数 str_len2() が必要になります.

そこで問題8-3です.関数 str_len2() を作成しなさい.str_len2() は,先に作成した関数 str_len() が文字列の長さを 0 の直前まで数えるのに対し,0 および '+', '-' のいずれかの直前まで数える点が異なります.



とのことなのですが、この説明ではatoi()の使い方があまり理解できませんでした;;
よかったらこの問題についても教えていただけるとありがたいです。

Re:文字列と配列の問題です

Posted: 2007年6月27日(水) 07:56
by toyo
i = i++;
これはコンパイラによってiが違ってくる可能性があります。
i = i + 1;

i++;
ですね。

戻り値がunsigned intなので i も unsigned int にしたほうが良いと思います。

do {
} while ( );
だと空文字列のとき動作が変になるのでwhile ( )ループの方が良いのでは。

以上を踏まえて
unsigned int str_len(char *c)
{
unsigned int i = 0;
while( *(c + i) != 0){
i++;
}
return i;
}