文字列配列の入れ替え

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

文字列配列の入れ替え

#1

投稿記事 by danbo12 » 7年前

大学の課題で 入力させたmain関数内で文字列を入力させそれをmystrlen関数内で長さをはかりgyaku関数内でその長さを受け取り、文字列の順番を逆にしたものを新しい配列にいれ、main関数内で表示するプログラムを作っています。
 一通り作ってみて実行してみたのですが
 文字列入力:aiueo

 フuフiフ
 終了するには(ry
とエラー警告のポップアップでvariable 'r' was corrupted

となってしまいます。自分でも調べてみたのですが解決方法がわかりません。
環境はwindowsでVSを使っています。
原因を教えていただけないでしょうか?
以下にコードをはります。

コード:

#include<stdio.h>
int mystrlen(char[]);
void gyaku(char s[], char f[]);
int main(void)
{
	char s[100];
	char r[100];

	printf("文字列入力:");
	scanf("%s", &s);

	gyaku(s,r);

	printf("%s\n",r);

	return 0;
}

void gyaku(char s[], char f[]) {
	int n,i = 0;
	n = mystrlen(s);


	for ( i = n - 1; i >= 0; i--) {
		f[(n - i) - i] = s[i];
	}
	f[n] = '\0';

	printf("\n");
}

int mystrlen(char s[]) {
	int i = 0;

	while (s[i] != '\0')
	{
		i++;
	}
	return i;
}



 

danbo12

Re: 文字列配列の入れ替え

#2

投稿記事 by danbo12 » 7年前

申し訳ござません。 文頭の入力させたmain関数~は誤表記です。ただしくはmain関数~です

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 文字列配列の入れ替え

#3

投稿記事 by みけCAT » 7年前

danbo12 さんが書きました:原因を教えていただけないでしょうか?
バグによりデータを書き込む位置がおかしくなっているからですね。
danbo12 さんが書きました:解決方法がわかりません。

コード:

		f[(n - i) - i] = s[i];

コード:

		f[(n - 1) - i] = s[i];
にすると改善しそうです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 文字列配列の入れ替え

#4

投稿記事 by みけCAT » 7年前

danbo12 さんが書きました:

コード:

	scanf("%s", &s);
scanfの書式%sにはchar*型のデータを渡さないといけないのに、char(*)[100]型のデータを渡しているので、未定義動作になります。
未定義動作になると、何がおこってもおかしくありません。
正しくは

コード:

	scanf("%s", s);
です。
バッファオーバーフローしないように入力の最大文字数を書式で指定したり、
入力が正しく読み込めたか戻り値でチェックするようにすると、さらによくなるでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

danbo12

Re: 文字列配列の入れ替え

#5

投稿記事 by danbo12 » 7年前

みけCAT様にご指摘頂いたところを直したところ、無事実行成功いたしました!ありがとうございます。 自分でもわかる範囲の間違いだったので気づけなかったの不思議です。。 コメントにあったとおりエラーの原因を探れるよう、ところどころにエラーチェックをいれるのを心がけて今後は書いていこうとおもいます。
ほんとにありがとうございました!

返信

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