ページ 11

AOJの問題

Posted: 2012年7月21日(土) 01:39
by little
初投稿になります。
C++の勉強がけらオンラインジャッジをしています。
始めたばかりですが...orz

・問題
文字列 str を入力したとき、その文字列を逆順に出力するプログラムを作成して下さい。文字は半角英数字のみで、20 文字以内とします。


・ソース

コード:

#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;
void sort(char *str){
	int len, len2 = 0;
	char work; 
	len = strlen(str);

	// 両端から交換
	for(len = len - 1; len > len2; len--, len2++){
		work = str[len];
		str[len] = str[len2];
		str[len2] = work;
	}
}

int main(){
	char str[20];

	cin >> str;
	sort(str);
	cout << str << endl;
	return 0;
}

・テスト
入力
w32nimda

出力
admin23w


になるのですが、ランタイムエラーでダメなようです。
どこがおかしいか助言いただけると大変助かります(_)

Re: AOJの問題

Posted: 2012年7月21日(土) 02:25
by たいちう
ソースはちゃんと見てないけど、バッファを21文字分にするとどうなります?
もしかしてC言語の文字列の扱いに不慣れなのでは?

Re: AOJの問題

Posted: 2012年7月21日(土) 02:41
by little
たいちうさん>
返信ありがとうございます。
char str[21]で提出しましたところ通りました。
(1回次の問題選択してて提出してエラーになりました;)

最大値もテストしたつもりだったんですが出来てなかったようです。
ありがとうございます!

コード:

#include <iostream>
#include <cstring>
#include <cstdio>
 
using namespace std;
void sort(char *str){
    int len, len2 = 0;
    char work; 
    len = strlen(str);
 
    // 両端から交換
    for(len = len - 1; len > len2; len--, len2++){
        work = str[len];
        str[len] = str[len2];
        str[len2] = work;
    }
}
 
int main(){
    char str[21];
 
    cin >> str;
    sort(str);
    cout << str << endl;
    return 0;
}
文字列は結構扱った記憶はあるんですが不慣れかもしれません。

Re: AOJの問題

Posted: 2012年7月21日(土) 07:54
by beatle
せっかくC++を使うのにstd::stringは使わないのですかね。

Re: AOJの問題

Posted: 2012年7月21日(土) 11:32
by softya(ソフト屋)
少なくとも文字列の最後にはナル文字が入るのは文字列の基本だと思いますので、もう少し勉強されたほうが良いかと。
※ 20文字の文字列を扱うためにはナル文字を含めた21文字分の配列が必要。

Re: AOJの問題

Posted: 2012年7月21日(土) 12:51
by little
解決してるんですがいろいろ返信頂いているので返します。

beatleさん>なるほど。

コード:

#include <iostream>
#include <string>

using namespace std;

void sort(string str){
    int len, len2 = 0;
    char work; 
  
	len = str.length();
 
    // 両端から交換
    for(len = len - 1; len > len2; len--, len2++){
       // ここ
    }
}
 
int main(){
	string str;
    cin >> str;
    sort(str);
    cout << str << endl;
    return 0;
}
reverseを使うといいようですが、
この型でやってみたいと思います。
コメントアウト部分がわからなかったので調べてみます。


softya(ソフト屋)さん>
わざわざ語句まで載せて頂いてすいません。
'\0'ですね。添字に気を取られて…ごめんなさい忘れてました(_)