ページ 11

配列について

Posted: 2013年6月06日(木) 00:24
by ともみん
また質問させていただきたいと思います。
あいかわらずプログラミング知識のない者ですが、どうぞよろしくお願いします。
ポインタについての課題に取り組んでいるのですが、作ったプログラムを実行するとSegmentation fault (core dumped)となって、実行できません。
一応コンパイルはできたのですが...
使っているのはC言語で、ソフトはcgwinです。
課題の内容は、文字列の長さを求める関数 str_len2() を作成すること.str_len2() は,ある文字列の先頭アドレスを実引数として与えられたとき,その文字列の長さ('\0' および '+', '-' のいずれかの直前までの byte数)を返す関数です.なお,この関数の第1行を
unsigned int str_len2(char *c)
と定めます("char *c" は "char c[]" としても同じです.コンパイラは,どちらも「c は char型のポインタ変数である」と解釈します).
私のプログラムを下に貼ります。
どうぞよろしくお願いします。

コード:

include <stdio.h>

unsigned int str_len2(char c[]){
	int i = 0;
	while(*(c+i)!= '\0'||*(c+i)!= '+'||*(c+i)!= '-'){
		i++;
	}
	return i;
}

int main(void){
	char a[100]; int i;
	printf("input string\n");
	scanf("%s",a);
	
	i = str_len2(a);

	printf("%d\n",i);
}


Re: 配列について

Posted: 2013年6月06日(木) 01:34
by トントン
まず、Segmentation fault (core dumped)の意味はわかりますか?
わからなければ、翻訳でもかけてみて、意味をさっとググッてみましょう。

次に上から順にどんな処理をしているか考えてみて
上のエラーがどこで起きているか突き止めてみましょう。

そうすれば、原因はわかるのではないでしょうか。

Re: 配列について

Posted: 2013年6月06日(木) 03:32
by 超絶右留斗羅天才プログラマー
*(c+i)が'\0'でない、かつ'+'でない、かつ'-'でないときは、ループするようになっています。つまり、無限ループになるということです。

5行目の||を全て&&に変換すると、うまく行きます。

そうすることによって、*(c+i)が'\0'でない、または'+'でない、または'-'でないときは、ループするようになります。

おおまか合っておりますので、あと一歩でしたね!
課題、頑張ってくださいヽ(*´∀`)ノ

Re: 配列について

Posted: 2013年6月06日(木) 11:58
by non
超絶右留斗羅天才プログラマー さんが書きました:*(c+i)が'\0'でない、かつ'+'でない、かつ'-'でないときは、ループするようになっています。つまり、無限ループになるということです。
「または」では?

Re: 配列について

Posted: 2013年6月06日(木) 13:58
by 超絶右留斗羅天才プログラマー
non さんが書きました:
超絶右留斗羅天才プログラマー さんが書きました:*(c+i)が'\0'でない、かつ'+'でない、かつ'-'でないときは、ループするようになっています。つまり、無限ループになるということです。
「または」では?
あら、ついうっかりΣ(ノ≧ڡ≦)てへぺろ
間違いのご指摘ありがとうございます(*´∀`)

Re: 配列について

Posted: 2013年6月07日(金) 22:31
by ともみん
超絶右留斗羅天才プログラマーさん、ハッカーさん、ご指摘ありがとうございました。

whileの条件式が間違っていましたね。

ご指摘を受けて、初めて気づきました。

否定が絡むと、中々難しいです。

上記の点を直したところ、正しく実行できました。

本当にありがとうございました。