タイトルの通り、ポインタを使って
回文(前から読んでも後ろから読んでも同じってやつです)
であるかどうか判断するプログラムを
作りたいのですが、
どうしてもうまく行きません。どうしたらいいでしょうか。
今の所こんな感じです
#include <stdio.h>
int main(void)
{
char string[256];
char *checkA, *checkB;
printf("Input String >> ");
scanf("%s", string);
for(checkA = string; *checkA != '\0'; checkA++){
;
}
checkB = string;
for(checkA = checkA - 1; checkA <= 0; checkA--){
*checkB = *checkA;
checkB++;
}
if(*checkA == *checkB){
printf("%s は左右対称です。\n", string);
}
else{
printf("%s は左右対称ではありません。\n", string);
}
return 0;
}
No.3ベストアンサー
- 回答日時:
おはようございます.
終了処理が怪しい為に一寸危険な感じになってますね.
ここでは,以下の方針を使います.
(1)文字列の長さの取得はstrlen()を使う
(2)ヌル文字での終端を保証するためにfgets()を使う
(3)前から走査するポインタと逆に走査するポインタで一文字づつ比較.
実装例として以下のような感じでどうでしょうか.
この場合,長さが奇数なら「真ん中の文字」を同時に参照した段階で止まります.
長さが偶数なら「となり同士の文字」で止まります.
参考までに.
#include <stdio.h>
#include <string.h>
#define MAX_STR 256
int main(void)
{
char string[MAX_STR];
char *checkA, *checkB;
int len, isanag;
printf("Input String >> ");
fgets(string, MAX_STR, stdin); /* scanfは安全じゃない */
len = strlen(string); /* 長さを取得 */
/* 文字列の長さが奇数なら自動的に終了する */
/* checkAは先頭から,checkBは最後尾から始める */
for(checkA = string, checkB = string + (len - 1), isanag=1;
(checkA !=checkB); checkA++, checkB--){
if(*checkB != *checkA){
isanag = 0;
break; /* 途中一文字でも違ったら終了 */
}
if((checkA+1)==checkB){
break; /* 文字列の長さが偶数の時の終了処理 */
}
}
if(isanag){
printf("%s は左右対称です。", string);
}
else{
printf("%s は左右対称ではありません。\n", string);
}
return 0;
}
No.9
- 回答日時:
#8です。
ポインタを使うんでしたね。以下のように直してください。static BOOL iskaibun(char *p) {
if ( p == NULL ) return FALSE; //NULLポインタの場合
WCHAR uni[256]; //UniCode取得用の領域
int a = MultiByteToWideChar(0,0,p,-1,uni,256) - 1;
if ( a <= 1 ) return FALSE; //有効字数が1以下の場合
WCHAR *seq = uni; //順方向のポインタ
WCHAR *rev = &uni[a - 1]; //逆方向のポインタ
for ( a /= 2 ; a > 0 ; a-- ) { //字数の半分の回数
if ( *(seq++) != *(rev--) ) return FALSE;
}
return TRUE;
}
No.8
- 回答日時:
漢字を考慮する必要があります。
考え方として、UniCode化してから比較すると楽です。
#include <windows.h>
static BOOL iskaibun(char *p) {
if ( p == NULL ) return FALSE; //NULLポインタの場合
WCHAR uni[256]; //UniCode取得用の領域
int a = MultiByteToWideChar(0,0,p,-1,uni,256) - 1;
if ( a <= 1 ) return FALSE; //有効字数が1以下の場合
for ( int b = 0 ; b < a ; b++ ) {
if ( uni[b] != uni[--a] ) return FALSE;
}
return TRUE;
}
int main(void) {
== 略 ==
if ( iskaibun(string) ) {
printf("%s は左右対称です。\n", string);
}
else {
printf("%s は左右対称ではありません。\n", string);
}
== 略 ==
★インデントに漢字空白を使っています。コピペ注意
MultiByteToWideCharは終端のNULL文字も字数として返すので、1を
減じてから使います。aは順方向、bは逆方向のインデックスです。
NULLポインタ、空文字列、1文字だけの場合はFALSEが返ります。
http://msdn.microsoft.com/ja-jp/library/cc448053 …
No.5
- 回答日時:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int kaibun(unsigned char *s)
{
unsigned char *p = s + strlen(s) - 1;
int i, j, k = (isalpha(*s) != 0);
while(s < p){
i = isalpha(*s);
j = isalpha(*p);
k |= (i || j);
if(i && j){
if(toupper(*s ++) != toupper(*p --)) return 0;
}
else{
s += !i;
p -= !j;
}
}
return k;
}
int main(void)
{
const char *result[] = {"回文ではありません。", "回文です。"};
char s[128];
scanf("%127[^\n]%*[^\n]%*c", s);
puts(result[kaibun(s)]);
return 0;
}
No.2
- 回答日時:
こんにちは。
別なやり方として
/* ポインタを使って前後が逆になっている文字列を作成する */
/* 元の文字列と逆の文字列とを文字列比較する */
ご参考までに。
No.1
- 回答日時:
どう「うまくいかない」のかを書きましょう。
まぁ現状ではSegmentation Faultだと思いますが。> for(checkA = checkA - 1; checkA <= 0; checkA--){
ループ終了条件が間違っているので、checkAがstringの先頭に到達しても終了せず更に前に行ってしまいます。
> *checkB = *checkA;
元文字列のstringを壊してます。また上記の通りループ終了条件が間違っているのでstringの終端に到達しても止まりません。
> if(*checkA == *checkB){
「文字列」の比較に論理演算子==は使えません。
僕の書いた奴だと先頭の文字だけ比較していたので
thatのようなものでもthatのtが同じだから
回文扱いされていました。
文字列の比較には==使えないんですか;
他の方がされているように
一文字一文字確認しないといけないですね;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# char string[100]; int c, i=0; while( (c=getchar()) 2 2022/05/30 21:41
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
このQ&Aを見た人はこんなQ&Aも見ています
-
好きなおでんの具材ドラフト会議しましょう
肌寒くなってきて、温かい食べ物がおいしい季節になってきましたね。 みなさんはおでんの具材でひとつ選ぶなら何にしますか? 1番好きなおでんの具材を教えてください。
-
家・車以外で、人生で一番奮発した買い物
どんなものにお金をかけるかは人それぞれの価値観ですが、 誰もが一度は清水の舞台から飛び降りる覚悟で、ちょっと贅沢な買い物をしたことがあるはず。
-
忘れられない激○○料理
これまでに食べたもののなかで、もっとも「激○○」だった料理を教えて下さい。 激辛、でも激甘でも。 激ウマ、でも激マズでも。
-
2024年のうちにやっておきたいこと、ここで宣言しませんか?
2024年も残すところ50日を切りましたね。 ことしはどんな1年でしたか? 2024年のうちにやっておきたいこと、 よかったらここで宣言していってください!
-
タイムマシーンがあったら、過去と未来どちらに行く?
20XX年、ついにタイムマシーンが開発されました。 あなたは過去に行く? それとも未来? タイムマシーンにのって、どこに行って、何をしたいか教えてください!
-
C言語プログラミングについて(回文、palindrome)
C言語・C++・C#
-
入力した文字列から母音だけを出力するプログラム
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CStringからchar*への型変換に...
-
char*を初期化したいのですが
-
C言語のintとcharの違いってな...
-
小数点入りの文字列をfloat型に...
-
strcat関数を自作したいです
-
char形配列の整数を抜き出したい
-
C++17で、unsigned char * 配列...
-
C言語にて構造体のメンバがNULL...
-
char AA[]{"全角文字"};から"全...
-
C言語のchar型配列を計算させる...
-
配列
-
new charとnew char[N]の違いは?
-
fread()関数とfwrite()関数につ...
-
警告 : 問題のあるポインタの変換
-
csvファイルを構造体に格納した...
-
C言語のプログラムについてです
-
const char* s1とただのchar s1...
-
char型について【初心者です】
-
C言語の文字リテラル中の16進文...
-
ビット演算のやり方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のintとcharの違いってな...
-
CStringからchar*への型変換に...
-
char*を初期化したいのですが
-
C言語にて構造体のメンバがNULL...
-
fstream型オブジェクトを関数の...
-
小数点入りの文字列をfloat型に...
-
new charとnew char[N]の違いは?
-
char型にint型の数値を代入する。
-
DWORDとcharの変換
-
C言語のプログラムについてです
-
2次元配列の文字"列"の初期化方法
-
文字型配列に格納した空白の切捨て
-
C++17で、unsigned char * 配列...
-
char 文字列型 の表現範囲が-12...
-
文字列の途中から途中までを抽出
-
警告
-
C言語 strstrの実装
-
コマンドライン引数 *argv[]は...
-
C言語の文字リテラル中の16進文...
-
csvファイルをfscanfで読み込む...
おすすめ情報