みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

プログラミングの問題で幾つか分からないことがあります。

プログラミングの問題で幾つか分からないことがあります。
入力した文字列のアスキーコードを1上げて表示するというもので、
#include <stdio.h>

int main(void){
char a[100];
int b, c;
scanf("%s", a);
for(b = 0; b <= 99; b++){
if(a[b] == '\n'){
break;
}
a[b] == a[b] + 1;
}
printf("%s", a);
return 0;
}
というふうに作ったのですが、基の文字列がそのまま表示されてしまいます。
あと、文字列strの中にある文字列bagに含まれる文字と同じ文字を空白に置き換える関数を作り、文字列を与えて動かすというプログラムで、
#include <stdio.h>

char str[100], bag[100];

int str_space(char str[], char bag[]){
int a, b, c, d;
for(a = 0; a <= 99; a++){
if(str[a] == '\n'){
b = a;
break;
}
}
for(a = 0; a <= 99; a++){
if(bag[a] == '\n'){
c = a;
break;
}
}
for(a = 0; a <= b; a++){
for(d = 0; d <= c; d++){
if(str[a] == bag[d]){
str[a] = ' ';
}
}
}
return 0;
}

int main(void){
scanf("%s", str);
scanf("%s", bag);
str_space(str, bag);
printf("%s", str);
return 0;
}
というふうに作ったのですが、動きませんでした。
ヒントでもいいのでどなたかお教え下さい。

投稿日時 - 2010-04-23 23:00:29

QNo.5847059

困ってます

質問者が選んだベストアンサー

(1)
> a[b] == a[b] + 1;
これだと a[b] と a[b]+1を比較することになります。等しくないので
0 ;
という文と同じ意味になります。
見掛け上なにも起りませんが、Cとして正しいプログラムです。
このように、Cで式に;を付けたものが、実行される文となります。
その式が意味があるものかどうかは関係ありません。

a[b] = a[b] + 1;
の単純なミスでしょう。
なお、このような場合には、複合代入演算子やインクリメント/デクリメント演算子を使うと間違いを減らせます。
a[b] += 1 ; /* 複合代入演算子 */
a[b] ++ ; /* インクリメント演算子 */

あと、細かい点ですが
> if(a[b] == '\n'){
文字列の最後は改行とは限りません。終了を表すのは '\0'がよいでしょう。

(2)
scanfの使い方と読み込んだ文字列の扱いによるものです。
・scanfの %s では、空白文字は入りません。「空白文字」とはスペース、タブ、そして改行文字も含まれます。
・改行文字が含まれないのですから
>if(str[a] == '\n'){
>if(bag[a] == '\n'){
などという判定は無意味です。先にも書いた通り、'\0'にしてください。

scanfに関しては、次のURLも参考にしてください。
http://www9.plala.or.jp/sgwr-t/c/sec05.html

これまた細かい点ですが
> char str[100], bag[100];
この位置に書くと、グローバル変数になります。
特に理由が無い場合は、使用する関数の中(今回ならmain関数の中)に書いた方がいいです。

あと、文字列の長さ測ってますが、次の様にすれば数える必要がなくなります
どうなっているか、はfor文の動作ついてよく調べてみてください。
int str_space(char str[], char bag[]){
int a, b;
for(a = 0;str[a] != '\0'; a++){
for(d = 0; bag[d] != '\0'; d++){
if(str[a] == bag[d]){
str[a] = ' ';
}
}
return 0;
}

投稿日時 - 2010-04-23 23:55:07

お礼

とてもよくわかりました。
有難うございました。

投稿日時 - 2010-04-24 11:18:30

ANo.3

このQ&Aは役に立ちましたか?

8人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

プログラム自体は両方の問題ともほぼ合っていますが、
細かいところが間違っているので動かない状態です。

プログラムは正直一字一句間違っても許されないと思ったほうが良いので
作成する際には気をつけましょう。

難しい話は書かずに修正点だけ書きます。

1問目

if(a[b] == '\n'){
この行の比較ですが文字列の末端に付くのは\nではなく\0です。

a[b] == a[b] + 1;
この行のイコールが二つになっているので値が代入されません。



2問目

1問目の同様
if(str[a] == '\n'){
if(bag[a] == '\n'){

上記2行の比較は\0と行ってください。



以上の修正で両方とも期待通りの動作をすると思います。
勉強頑張ってください

投稿日時 - 2010-04-23 23:32:53

お礼

動くようになりました。有難うございます。

投稿日時 - 2010-04-24 11:19:17

ANo.1

(1)「==」で代入はできません。
(2)scanf()の結果に改行は入りません。

投稿日時 - 2010-04-23 23:28:11