配列について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ともみん

配列について

#1

投稿記事 by ともみん » 12年前

また質問させていただきたいと思います。
あいかわらずプログラミング知識のない者ですが、どうぞよろしくお願いします。
ポインタについての課題に取り組んでいるのですが、作ったプログラムを実行すると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);
}


トントン
記事: 100
登録日時: 14年前

Re: 配列について

#2

投稿記事 by トントン » 12年前

まず、Segmentation fault (core dumped)の意味はわかりますか?
わからなければ、翻訳でもかけてみて、意味をさっとググッてみましょう。

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

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

超絶右留斗羅天才プログラマー

Re: 配列について

#3

投稿記事 by 超絶右留斗羅天才プログラマー » 12年前

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

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

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

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

non
記事: 1097
登録日時: 14年前

Re: 配列について

#4

投稿記事 by non » 12年前

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

超絶右留斗羅天才プログラマー
記事: 44
登録日時: 12年前

Re: 配列について

#5

投稿記事 by 超絶右留斗羅天才プログラマー » 12年前

non さんが書きました:
超絶右留斗羅天才プログラマー さんが書きました:*(c+i)が'\0'でない、かつ'+'でない、かつ'-'でないときは、ループするようになっています。つまり、無限ループになるということです。
「または」では?
あら、ついうっかりΣ(ノ≧ڡ≦)てへぺろ
間違いのご指摘ありがとうございます(*´∀`)
ただの超絶右留斗羅天才プログラマーです。同人ゲーム制作進捗度:7%

ともみん

Re: 配列について

#6

投稿記事 by ともみん » 12年前

超絶右留斗羅天才プログラマーさん、ハッカーさん、ご指摘ありがとうございました。

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

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

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

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る