ページ 11

特定の文字数を数えるには

Posted: 2006年12月08日(金) 01:21
by オルムント
質問させていただきます。

問題

"(",")"が何個含まれているか数えなさい。

表示例

(((()()(()

"(" = 7
")" = 3

どうやって作るのでしょうか。
まったく見当もつかないのでお願いします。

Re:特定の文字数を数えるには

Posted: 2006年12月08日(金) 01:46
by 管理人
こんにちは、管理人です。

配列にその文字列を格納し、
配列の最初から順番に中身を比較し、カウントしていけばいいですよ。
st[/url]に文字列を格納したのなら

if(st=='(')
  count1++;
if(st==')')
  count2++;

こんな感じです。

文字列は入力されたものですか?
それとも最初から固定の文字列ですか?

Re:特定の文字数を数えるには

Posted: 2006年12月08日(金) 01:55
by 管理人
まず、
(を数えるcount1という変数を用意し、
)を数えるcount2という変数を用意します。
また、文字列の長さを格納するlenという変数も用意します。

int count1=0,count2=0,len;

stに文字列を格納します。

char st[/url]="(((()()(()";

文字列の長さを取得するstrlen関数を使ってlenに文字列の長さを格納します。
この関数を使うためにstring.hをインクルードする必要があります。

len = strlen(st);

for文で配列の要素数だけループさせます。
先ほど測定したlenの値だけループさせます。

for(int i=0;i<len;i++){

もし今調べている配列要素が(ならcount1++し

if(st=='(')
count1++;

今調べている配列要素が)ならcount2++します。

else if(st==')')
count2++;
}

後は表示するだけ。

printf("%s\n\n",st);
printf("\"(\"=%d\n",count1);
printf("\")\"=%d\n",count2);
return;
}


こちらがそれをまとめたものです。

これ実際に実行してみて自分がやりたいこととあってるか確認してください。


#include <stdio.h>
#include <string.h>

void main(){
	int count1=0,count2=0,len;
	char st[/url]="(((()()(()";

	len = strlen(st);

	for(int i=0;i<len;i++){
		if(st=='(')
			count1++;
		else if(st==')')
			count2++;
	}

	printf("%s\n\n",st);
	printf("\"(\"=%d\n",count1);
	printf("\")\"=%d\n",count2);
	return;
}

Re:特定の文字数を数えるには

Posted: 2006年12月08日(金) 01:57
by 管理人
もし、自分が入力した文字列を測定したいのならば

len = strlen(st);

の前に

scanf("%s",st);

を書けばいいです。(stの宣言で初期化する必要がなくなります。)

Re:特定の文字数を数えるには

Posted: 2006年12月08日(金) 02:03
by 管理人
あ、後表示にはエスケープシーケンスを使っています。

"

↑ダブルコーテーション は普通表示できません。
普通に表示させようとすると

printf(""");

こんな感じになってしまいます。
しかしこれはダブルコーテーションで囲んだことになりません。

printf("1" "2");

こんな書き方もあるので、ダブルコーテーションが3つっていうのは変です。

" を表示させるにはどうしたらいいか?
それは「"」の前に「\」をつけることです。
そうすることで、「"」が表示できるようになります。

Re:特定の文字数を数えるには

Posted: 2006年12月08日(金) 02:19
by オルムント
すごくわかりやすい解説ありがとうございます。

文字列は自分で入力のものです。
色々と試してみたのですが、教えてもらったものだとエラーが出てしまいます。
iが宣言されてなかったので宣言しました。
他にエラーの要因になるところが見当たらないのですが何故エラーになるのでしょうか?
お願いします。

Re:特定の文字数を数えるには

Posted: 2006年12月08日(金) 02:38
by Justy
>エラーの要因になるところが見当たらないのですが何故エラーになるのでしょうか?
 エラーですか。
 あぁ、C++形式で書かれていますね。
 変数 iの宣言位置を直したのであれば、後は strlenの戻り値は intではないので、そのあたりで警告が出ているのではないでしょうか。
 ちょっと強引なのであまり多用して欲しくはないですが、下のようにすれば手っ取り早く解決できるかと思います。
[color=#d0d0ff" face="monospace]    len = (int)strlen(st);[/color]

Re:特定の文字数を数えるには

Posted: 2006年12月08日(金) 02:39
by 管理人
iはfor文の中で宣言してあります。

Cだと宣言は最初に宣言しないとエラーになるので、環境があわなかったのですね。
すみません。
(C++のコンパイラだとどこで宣言してもいいので)


エラーになったときのメッセージになんと書いてありますか?
コピペしてもらったらわかりやすいです。

Re:特定の文字数を数えるには

Posted: 2006年12月08日(金) 02:52
by オルムント
迅速な対応感謝します。

試してみた変更点は
1.for文の中でのiの宣言を最初にしました。
2.len = (int)strlen(st);に変更しました。
です。

エラーは
「配列または、ポインタでない変数に添字が使われました。」というエラーです。
if(st=='(')
else if(st==')')
上記の2行がエラーの原因のようなのですがどうでしょうか?

Re:特定の文字数を数えるには

Posted: 2006年12月08日(金) 03:05
by 管理人
Justyさん、
そういう小さい(?)警告がぜんぜん出ないんですよ私の使ってるVS2003。
なんでなんでしょう??
前も返り値の型間違ってたのに全然警告でなくて気づきませんでした。

後、返り値はsize_tですよね。size_tってunsigned intと同じでしたっけ?
intに変換して何か悪い事起きます?あれば教えてください。
私の考える範囲ではintの領域を超えてしまわない限りおきないと思ってました。


オルムンとさん、
stの宣言の部分ちゃんとサンプルと同じように宣言されてますか?

Re:特定の文字数を数えるには

Posted: 2006年12月08日(金) 03:23
by オルムント
すみません
宣言を
char st;
と配列にしてなかったのが原因です。

書き直し、実行できました。


#include <stdio.h>
#include <string.h>

int main(){
int count1=0,count2=0,len,i;
char st[256];

scanf("%s",st);

len = strlen(st);

for(i=0;i<len;i++){
if(st=='(')
count1++;
else if(st==')')
count2++;
}
printf("\"(\"=%d\n",count1);
printf("\")\"=%d\n",count2);
return 0;
}


夜分遅くに迅速な対応本当に感謝します。
ありがとうございました。

Re:特定の文字数を数えるには

Posted: 2006年12月08日(金) 03:30
by Justy
>そういう小さい(?)警告がぜんぜん出ないんですよ私の使ってるVS2003
 2003だと・・・64bit移植への対応が有効になっていて、警告レベルが3以上で出ます。


>size_tってunsigned intと同じでしたっけ?
 大抵はそうみたいです。
 環境によっては違うかもしれません。
 規定では符号なしの整数としか決まっていませんから・・・。


>intに変換して何か悪い事起きます?あれば教えてください。
 sizeof(size_t)==sizeof(int)が確実に保証できれば、実害はほぼないはずです。
 文字列のサイズが intで扱える範囲を超えてなければ・・・。

Re:特定の文字数を数えるには

Posted: 2006年12月08日(金) 03:31
by 管理人
完成できてよかったです。

また何かあったら聞いてくださいね☆

Re:特定の文字数を数えるには

Posted: 2006年12月08日(金) 03:42
by 管理人
Justyさん、なるほど、ありがとうございます。
逆にここで質問してしまいましたm(_ _)m

文字列のサイズがintの扱える範囲を超えることは無いかと思ったのですが
lenに格納するのに正しくはどう書けばいいのでしょう?
lenをsize_tで宣言して、
for( i = 0 ; i < (int)len ; i++)
でしょうか?でも、これだと結局同じ事か・・。

Re:特定の文字数を数えるには

Posted: 2006年12月08日(金) 09:49
by keichan
>lenをsize_tで宣言して、
>for( i = 0 ; i < (int)len ; i++)
i も size_t で宣言しちゃいましょう