
A 回答 (6件)
- 最新から表示
- 回答順に表示

No.6
- 回答日時:
バグってましたね、わたし^^; こうですね。
=====
#include <ctype.h>
void end_trim(char *s)
{
char *p = s;
if (!*p) return;
while (*p) ++p;
--p;
while (s < p && isspace(*p)) --p;
if (s == p && isspace(*p)) *p = '\0';
else *++p = '\0';
}

No.5
- 回答日時:
あぁ。
。あと、strrchr() は、たぶん、downboy さんが必要なものではないでしょう。strrchr() は、末尾から指定された文字を探すだけですから、非空白文字の間に入っている空白も探しますのからね。末尾から空白が続いているかどうかは判別できません(末尾の空白の連かどうかを調べようと思えば、ポインタの比較するのでしょうが、それをやるなら、自分でループを書くのよりごちゃごちゃするでしょう)。
No.4
- 回答日時:
「2つ以上空白…」のところの意味がよくわからないし、空白というのがスペースだけの意味なのか、isspace() が true になるものという意味なのかわかりませんが。
。とりあえず、文字列の末尾の空白類を省くというようなのは、以下の end_trim() のような感じになると思いますよ。====
#include <ctype.h>
void end_trim(char *s)
{
char *p = s;
while (*p) ++p;
--p;
while (s < p && isspace(*p)) --p;
*p = '\0';
}
#include <stdio.h>
#include <string.h>
int main()
{
char a[] = "akak dkj kdfl ";
printf("\"%s\"\n", a);
end_trim(a);
printf("\"%s\"\n", a);
a[0] = '\0';
printf("\"%s\"\n", a);
end_trim(a);
printf("\"%s\"\n", a);
strcpy(a, " ");
printf("\"%s\"\n", a);
end_trim(a);
printf("\"%s\"\n", a);
}
==== テスト結果
% ./a.out
"akak dkj kdfl "
"akak dkj kdf"
""
""
" "
""
No.3
- 回答日時:
★sakusaker7へ。
>自分で作るまでもなくそれがないライブラリしかない
>コンパイラを探す方が大変なのでは?
今、調べたら ANSI-C から strrchr() 関数はありましたね。
昔、strrchr を自作した記憶があり(ANSI-C)は無かったと思い込んでしまいました。
strdup、strrev はマクロソフト社の独自関数で strrchr などもそうなのかと思いました。
もしかしたら C 言語のお勉強として文字列の関数を自分でも実装していた頃の記憶で
ANSI-C には無かったという思い込みをしていたようです。
ご指摘有り難うございました。
質問者さんへ。
・strrchr() 関数に関しては自作する必要は無いみたいです。
ただマルチバイト文字(漢字文字)の第2文字と同じ文字を検索するときは注意して下さい。
今回は空白文字なので特に問題はないですけど。
・以上。
参考URL:http://always-pg.com/c/runtime_rd/string/strrchr …
No.2
- 回答日時:
> あと strchr() に似せた strrchr() 関数を作成しておくと便利です。
自分で作るまでもなくそれがないライブラリしかない
コンパイラを探す方が大変なのでは?
BohYoh.com【C言語講座】標準ライブラリ関数 strrchr
http://www.bohyoh.com/CandCPP/C/Library/strrchr. …
sが指す文字列の中に最も末尾側に出現する(char型に変換した)cを探す。cは文字列の終端を示すナル文字でもよい。
探し出した文字へのポインタを返す。文字がなければ空ポインタを返す。
No.1
- 回答日時:
★末尾空白の削除ですよね。
・仕組みは
(1)fgets() 関数で取得した文字列 buf の末尾にポインタを移動します。
(2)末尾ポインタを buf の先頭に向けて移動しながら
空白文字なら \0 を書き込む
空白以外の文字(英字)が最初に現れたら break で抜ける
(3)移動ポインタが buf まで来てしまったら全てが空白文字の文字列なので buf の
先頭に \0 が書き込まれて処理が終了します。
考え方はこんな感じです。
・別の文字型配列やポインタ領域にコピーする方法もありますが、連続する末尾の空白を
\0 文字で上書きする方が簡単かもしれない。
上記以外にもいろいろと方法はあると思います。
下にサンプルを載せておきます。
サンプル:
// 空白文字の定数
#define SPC ' '
char buf[ 128 ];
char *p;
// 文字列の入力
fgets( buf, sizeof(buf), fp );
// 末尾へポインタを移動
for ( p = buf ; *p != '\0' ; p++ ){
;
}
// 末尾の連続する空白を \0 で上書き
for ( p-- ; p >= buf ; p-- ){
if ( *p == SPC ){
*p = '\0';
}
else{
break;
}
}
その他:
・末尾の連続する空白以外を別領域にコピーする場合は最後に現れた空白文字を探して
そこまでをコピーすれば良いです。
こちらはご自分で考えてみて下さい。
・あと strchr() に似せた strrchr() 関数を作成しておくと便利です。
char *strrchr(str,c) 関数は最後に見つかった c のポインタ位置を返す仕様です。
見つからない場合は NULL ポインタを返すようにします。
こんな関数を自作して用意しておけばいろいろと便利に今後利用できます。
これも興味があったらご自分で作ってみて下さい。
・以上。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C#の問題です。 文字列型の配列 s[100] にキーボードから入力された100文字以内の文字列(単 2 2022/06/22 15:18
- Excel(エクセル) capeofdragonと申します Excel2016を使っておりまして 半角又は全角の任意文字列が 2 2022/10/31 13:51
- Excel(エクセル) Excelについて質問です(ver2019) 1 2023/06/30 21:20
- Visual Basic(VBA) エクセルVBAについて 2 2023/01/31 16:21
- その他(データベース) Accessのクエリで1フィールドの抽出条件設定をNullでなく全角半角含む空白のみの文字列でない文 1 2023/04/24 15:20
- Excel(エクセル) エクセルの数式で教えてください。 1 2023/02/08 09:05
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
- Visual Basic(VBA) VBA 「,」・空白・カタカナ等の複数条件のマクロ 2 2023/08/23 11:57
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VC++20051を最近はじめました
-
strcatの逆をしたい
-
WM_CHAR or WM_KEYDOWN の「wPa...
-
c言語でcsvファイルの処理で、...
-
CStringからchar*への型変換に...
-
C++Builder 2009 テキスト...
-
プログラムの中身の意味
-
char型にint型の数値を代入する。
-
C言語で文字列をかえす正しい書...
-
C言語のintとcharの違いってな...
-
C言語の文字リテラル中の16進文...
-
reallocについて
-
配列の要素数に変数を入れたい...
-
引数で指定された配列の要素数...
-
関数から配列を返すには?
-
ポインタ
-
C言語の平均点の出し方
-
キーボード配列をもとに戻す方法
-
C# ArrayListを二次元配列のよ...
-
複数の選択範囲の行番号を個別...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringからchar*への型変換に...
-
char*を初期化したいのですが
-
C言語のintとcharの違いってな...
-
char型にint型の数値を代入する。
-
C言語にて構造体のメンバがNULL...
-
fgetc( )の戻り値はなぜ整数??
-
char 文字列型 の表現範囲が-12...
-
fstream型オブジェクトを関数の...
-
C++17で、unsigned char * 配列...
-
DWORDとcharの変換
-
文字列内の数字削除
-
new charとnew char[N]の違いは?
-
文字型配列に格納した空白の切捨て
-
C++Builder 2009 テキスト...
-
csvファイルをfscanfで読み込む...
-
文字列の途中から途中までを抽出
-
[C] 構造体メンバーのカンマ区...
-
エクセルのMID関数は、C言語では?
-
小数点入りの文字列をfloat型に...
-
wsprintf( ポインタ , "%d" , "...
おすすめ情報