専門家に聞いた!繰り返す痔の原因は!? >>

C言語の質問です。文字列str中の数字文字を削除する関数をポインタを使って作りたいのですが、どう作ったらいいかわかりません。方向性だけでも教えてくれませんか。
ちなみにヒントとして以下の部分は与えられてました。よろしくお願いします。
void del_digit(char *str)
{
char *ptr = str;
while(*str){

このQ&Aに関連する最新のQ&A

A 回答 (4件)

strの中身から数字をなくす方法


#include<stdio.h>
void del_digit(char *str);
int main(void)
{
char *str = "abcd234678efg";
del_digit(str);
puts(str);
return 0;
}
void del_digit(char *str)
{
char *ptr = str;
int i = 0;
while(*ptr != '\0')
{
if(*ptr < '0' || *ptr > '9')
{
*(str+i) = *ptr;
i++;
}
ptr++;
}
*(str+i) = '\0';
}
    • good
    • 0

まあ、簡単に2バイトコードとか考えないで作るなら。


2バイトコード判定するなら2バイトコードの後の1バイトは判定しない様に処理増やして。

void del_digit(char *str)
{
char *ptr = str;

/* 引数のNULLチェック */
if(str == NULL){
return;
}
while(*str){
if(((*str) < '0') || ('9' < (*str))){
/* 数字と一致しなければコピー */
*ptr = *str;
ptr++;
}
str++;
}
*ptr = NULL;
}
    • good
    • 0

ひとつの方向性としては、



与えられた文字列と同じサイズのバッファを別途用意し、与えられた文字列の先頭から1文字ずつたどりながら数字以外であったらその文字を用意したバッファに書き込んでいく。最後までたどり終わったらバッファにお望みの文字列が入っているはずです。

というのがアルゴリズムとしてはわかりやすいとおもいます。
    • good
    • 0

削除した部分はどうするのですか?


*str="abcd234678efg"
なら
"abcdefg\0"
になるようにしたいんですか?

この回答への補足

そうです。すみません説明不足でした。

補足日時:2005/11/13 22:38
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

Q文字列strの中から文字cを探すプログラム(C言語)がわからない

文字列strの中から文字cを探すプログラム(C言語)がわからない
柴田望洋さんの「[新版]明解C言語」という本の演習11-2なんですがどうしてもわかりません。間違いは無いと思うのにコンパイルすると警告を吐かれます。

僕が書いたプログラムを載せます。

/*
文字列strの中に、文字cが含まれていれば(複数ある場合は、最も先頭側とする)、
その文字へのポインタを返し、含まれていなければNULLを返す関数
char *str_chr(const char *str, int c) {}
を作成せよ。
*/
#include<stdio.h>
char *str_chr(const char *str, int c){
while(*str){
if(*str==c) return str;
str++;
}
    return NULL;
}
int main(){
char *str;
char c;

scanf("%s",str);
scanf(" %c",c);
    printf("%d",str_chr(str,c));

return 0;
}

コンパイラは「関数str_chrのif分の中のreturn strの型変換に問題がある」と言っているんです。
型変換はしるつもりは無いのにコンパイラはなぜそのように認識するのでしょうか。
またネット答えを探しましたがどうやらこのreturn strの部分はreturn (char*)strが正解のようです。意味がわかりません。strはポインタなのになぜまたわざわざchar型に変換しているのですか?といか(char*)の意味が根本的にわかりません。

質問ばかりですみません。初心者でポインタがどうにも理解できないんです。
誰か詳しい人教えてください。
お願いします。

文字列strの中から文字cを探すプログラム(C言語)がわからない
柴田望洋さんの「[新版]明解C言語」という本の演習11-2なんですがどうしてもわかりません。間違いは無いと思うのにコンパイルすると警告を吐かれます。

僕が書いたプログラムを載せます。

/*
文字列strの中に、文字cが含まれていれば(複数ある場合は、最も先頭側とする)、
その文字へのポインタを返し、含まれていなければNULLを返す関数
char *str_chr(const char *str, int c) {}
を作成せよ。
*/
#include<stdio.h>
char *str_chr(const ch...続きを読む

Aベストアンサー

char *str_chr(const char *str, int c) {}

という宣言では
戻り値: char *型(charへのポインタ)
引数: str (cosnt char *型/const charへのポインタ)
となります。

const char というのは、「変更できないchar」と言う意味です。
char c='A' ;
const char cc='A' ; /* 初期化によってのみ代入可能 */

c ='C' ; /* OK */
cc ='C' ; /* エラー */

const char * はconst char への(普通の)ポインタです。ポインタが指す実体はconst charなので変更できませんが、ポインタ自身は通常の変数なので変更できます。
char str[] = "abcde" ;
char * cp = str;
const char* ccp ="ABCDE" ;

cp ++ ; /* OK */
*cp = 'A' ; /* OK */

ccp ++ ; /* OK */
*ccp = 'A' ; /* エラー */

このように、振舞いが違うので、char/char *型とは別の型として扱われます。
char → const char,char * → const char * は暗黙の型変換ができます。変更を禁止するだけですから。
逆方向は、(本来は)基本できません。const の意味を失ってしまうし、文字列リテラルのような本当に変更してはいけない(致命的なエラーになりかねない)ものもあるからです。

型変換(キャスト)は、暗黙の変換ができない場合でも、強制的に型変換を行うもので、変換したいものの前に
(変換したい型)
と付けます。 (char *)str はstrの型を強制的にchar *型にします。
なお、この変換は、キャストを書いた箇所だけのもので、変数そのものを変換するわけではありません。


さて、問題のプログラムですが。
return str としていますから、char * 型をreturnしなければならないところに、const char *型を指定している、という警告です。
const char * → char *の暗黙の型変換は無いので、char *として使えない、ということです。
そのため、戻り値の型を合わせるために(char *)でキャストしています。


> strはポインタなのになぜまたわざわざchar型に変換しているのですか?

char型には変換していません。
char型に変換するときは(char)です。

char *str_chr(const char *str, int c) {}

という宣言では
戻り値: char *型(charへのポインタ)
引数: str (cosnt char *型/const charへのポインタ)
となります。

const char というのは、「変更できないchar」と言う意味です。
char c='A' ;
const char cc='A' ; /* 初期化によってのみ代入可能 */

c ='C' ; /* OK */
cc ='C' ; /* エラー */

const char * はconst char への(普通の)ポインタです。ポインタが指す実体はconst charなので変更できませんが、ポインタ自身は通常の変数なので変更できます。
c...続きを読む

QC#「オブジェクト参照が必要です」(初心者)

Visual C# 2008を学習中なんですが、とりあえず何か作ってみようと思って、パラパラマンガに挑戦してみました。
Form1にpictureBox1を作り、waitを入れてイメージを書き換えるという単純なものです。
ところが実行しようと思ったら、「静的でないフィールド、メソッド、またはプロパティ’WindowsFormApplication1.Form1.pictureBox1’でオブジェクト参照が必要です」というエラーが出ます。その際のフォーカスは、main()内の
Form1.pictureBox1.image = Image.FromFile("motion1.png");
”Form1.pictureBox1”に当てられています。

何が原因と考えられるでしょうか。
もし情報不足であればご指摘いただくか、あるいはこの目的においてやらなければいけないこと、を大雑把に教えていただくだけでも幸いです。
よろしくお願いします。

Aベストアンサー

main()内に記述されているとのことですので、たぶん、
Form1.pictureBox1.Image=Image.FromFile("motion1.png");
Application.Run(new Form1());
と書いているのではないでしょうか?

連載 改訂版 C#入門 第3章 クラスとインスタンス
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_003/cs2_003_01.html#cs0302

ここであるように、オブジェクト指向にはクラスとインスタンスという概念があります。
今のコードでは、Form1クラスを操作しようとしているのでそのようなエラーが出ます。

具体的な解決方法としては、PictureBoxに初期画像を設定する処理をForm1のコンストラクタでやるのがいいと思います。
その際、redfox63さんがおっしゃられるように
this.pictureBox1
と記述することが必要です。(thisは自分自身のインスタンスを指します)

後は、Windowsフォームで一定間隔での処理をするための「Timerコンポーネント」について調べてみたらいいと思います。

タイマにより一定時間間隔で処理を行うには?(Windowsタイマ編)
http://www.atmarkit.co.jp/fdotnet/dotnettips/372formstimer/formstimer.html

MSDNライブラリ Timerクラス
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.timer.aspx

参考URL:http://www.atmarkit.co.jp/fdotnet/csharp_abc2/index/

main()内に記述されているとのことですので、たぶん、
Form1.pictureBox1.Image=Image.FromFile("motion1.png");
Application.Run(new Form1());
と書いているのではないでしょうか?

連載 改訂版 C#入門 第3章 クラスとインスタンス
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_003/cs2_003_01.html#cs0302

ここであるように、オブジェクト指向にはクラスとインスタンスという概念があります。
今のコードでは、Form1クラスを操作しようとしているのでそのようなエラーが出ます。

具...続きを読む

Qatoi を自作するには

atoi という関数がありますが、これを自作しているページがあれば教えてください。もしくは、直接回答でも構いません。自分で書いているんですが、どうもポインタで失敗しているようなので、参考になるようなソースがあれば御紹介ください。

Aベストアンサー

こんなページがあります。

「次頁」に回答例がありソースがあります。

参考URL:http://www.sgnet.co.jp/c/9-1.htm

QC#でTextBoxに数値のみ入力可能とする方法

C#の超初心者です。C#.NETでWindows環境下でプログラム開発を行っています。TextBoxで数値のみ入力可能にする方法を教えてください。

Aベストアンサー

private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
if(!('0' <= e.KeyChar && e.KeyChar <= '9'))
e.Handled=true;
}
keyPressイベントで
Handled に true を設定すれば、キャンセルできます。
小数点のチェックを入れる場合は、チェックをもう少し考えないといけません

Q文字列を後ろから1文字ずつ表示する

初歩的なプログラミングです。
C言語の勉強中で、タイトルの通りの
プログラムを作りたいのですが、
何かヒントを頂けないでしょうか。

自分で書いてみて失敗したのは下記の
通りです。

char s[11];
int i=0;

printf("文字列入力(10文字以内-->)");
gets(s);
printf("s=%s",s);

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

while(i=0){
printf("%c\n",s[i-1]);
i--;
}

宜しくお願いします。

Aベストアンサー

最後の表示部分のwhileの条件がおかしいですね。

while(i=0){
printf("%c\n",s[i-1]);
i--;
}

では、iに0を代入した真偽を見て、真ならループする様になっています。

while(i>0){
printf("%c\n",s[i-1]);
i--;
}

でうまくいくでしょう。

Q関数とメソッドの違い

初歩的な質問なのですが、
関数とメソッドの違いが分からず悩んでいます。
書籍や人によって、
関数とメソッドは同じ物として書いている物もあれば、
メソッドはクラスに関連付いた関数としていたり、
クラスでもpublic関数だけとか、
引数のある物がメソッド、
逆に無い物がメソッド等々…で、
どれが正しいのか良く分からないのです。

関数とメソッドの違いを教えていただけますよう、
お願いいたします。

Aベストアンサー

正解だけ先に言っておきましょう。オブジェクト指向での定義は
「メソッドとは、オブジェクトに送られてきたメッセージを処理するモノ」
「関数とは、メソッドの実装」
ついでに、
「メッセージとは、オブジェクトに何かしらお願いするために送られるモノ」
です。メッセージとメソッドと関数は明確に違うのですよ。


上記の通りなんですが、質問の文について、なにが正しいか、という解答は「文脈による」としか言いよ
うが無いんです。
解説書の一部分だけ抜き出して考えるのは非常に危険な行為です。
文脈を色々変えてみます。例えばオブジェクト指向の話をしているとしたら、

>1. 関数とメソッドは同じ物として書いている物もあれば、
バツ。意味的に全く異なります。
'\0'と""とNULLと0くらい違います。等価なんていってしまったら石が飛びます。(私が投げます:-p)

> 2.メソッドはクラスに関連付いた関数としていたり、
サンカク。C++での実装はそうでしょうが、オブジェクト指向を考える上で、その考え方は危険です。

> 3.クラスでもpublic関数だけとか、
> 引数のある物がメソッド、
> 逆に無い物がメソッド等々…で、
バツ。引数の数でメソッドで無くなる?そんなバカな!
例えprivateでもメソッドですよ。


オブジェクト指向言語C++のことを考えよう!という文脈ならば、
1.サンカク。実装は確かにそうなってます。ですが、上記の通り意味的に違うんです。
2.○。C++において、メソッドは「クラスに関連ついた関数」として実装されてます。
3.そんなわけないでしょう。

オブジェクト指向?なにそれ?構造体に関数がくっついただけでしょ?と乱暴極まりない文脈なら、
1.○。当然!
2.なにいってるの?
3.サブルーチンとファンクションの違いだ!


と、文脈で全然変わるんですよ。これに関しては、本一冊だけだとなかなか気付きにくいです。
是非とも多数の本を読み比べることをお勧めします。

正解だけ先に言っておきましょう。オブジェクト指向での定義は
「メソッドとは、オブジェクトに送られてきたメッセージを処理するモノ」
「関数とは、メソッドの実装」
ついでに、
「メッセージとは、オブジェクトに何かしらお願いするために送られるモノ」
です。メッセージとメソッドと関数は明確に違うのですよ。


上記の通りなんですが、質問の文について、なにが正しいか、という解答は「文脈による」としか言いよ
うが無いんです。
解説書の一部分だけ抜き出して考えるのは非常に危険な行為です...続きを読む

Q文字列中に含まれる文字の個数をカウントするプログラムについて…

文字列、1文字が与えられたとき、これをポインタで入力し文字列中に含まれる文字の個数を計算するプログラムを作成せよ。

と、いう課題がだされたんですけど、ユーザが任意の文字列と1文字を入力できるようにすることができません…。
多分main関数の部分をちょっといじくればよいと思うのですが…。
どなたかアドバイスをお願いします。
#include <stdio.h>

int count(const char *str, const char ch)
{
int cnt=0;
while (*str!='\0')
{
if (*str==ch)
cnt++;
str++;
}
return cnt;
}

int main()
{
const char *str="hello,world!";
const ch='o';

int cnt;

cnt=count(str, ch);

printf("%s中に%cは%d個です\n", str, ch, cnt);


return 0;
}

文字列、1文字が与えられたとき、これをポインタで入力し文字列中に含まれる文字の個数を計算するプログラムを作成せよ。

と、いう課題がだされたんですけど、ユーザが任意の文字列と1文字を入力できるようにすることができません…。
多分main関数の部分をちょっといじくればよいと思うのですが…。
どなたかアドバイスをお願いします。
#include <stdio.h>

int count(const char *str, const char ch)
{
int cnt=0;
while (*str!='\0')
{
if (*str==ch)
...続きを読む

Aベストアンサー

scanf"%s", str)は、バッファオーバーフローの危険と改行文字の食べ残し問題がありますね。
-- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< --
int main()
{
char ch;
char str[BUFSIZ];
int cnt;

printf("文字列を入力して下さい > ");
fgets(str,BUFSIZ,stdin);

printf("カウントする文字を入力してください > ");
ch = getchar();

cnt=count(str, ch);
printf("%s中に%cは%d個です\n", str, ch, cnt);

return 0;
}

Q数字文字の出現回数を表示するプログラム(C言語)

タイトルのようなプログラムをCで作ろうとしています。ちなみに初学者です。
たとえば 32356695 と入力すると
'0' appeared 0 times.
'1' appeared 0 times.
'2' appeared 1 times.
'3' appeared 2 times.
'4' appeared 0 times.
'5' appeared 2 times.
'6' appeared 2 times.
'7' appeared 0 times.
'8' appeared 0 times.
'9' appeared 1 times.
と表示されるようにしたいです。そこで以下のようなプログラムを組みましたが
コンパイルは成功するもexeを実行すると数字入力後エラーメッセージが出ます。
*************************************************
#include<stdio.h>
#include<string.h>
#include<stdlib.h>


int main(void)
{
int i;
int count[10]={0};
int length;
int digit;
char str[100];

printf("Please input number:");
gets(str);

length = strlen(str);

for(i=0;i<length;i++){

if(str[i]>='0' && str[i]<='9'){
digit = atoi(&str[i]);
count[digit]++;
}
}

for(i=0;i<=9;i++){
printf("'%d' appeared %d times.\n",i,count[i]);

}

return(0);
}
******************************************************
よくわからないのですが何故か文字列の長さを収納する変数lengthが1になているようです。
どうかお力添えください。お願いいたします。
コンパイラはbcc32、OSはWindowsXPです。

タイトルのようなプログラムをCで作ろうとしています。ちなみに初学者です。
たとえば 32356695 と入力すると
'0' appeared 0 times.
'1' appeared 0 times.
'2' appeared 1 times.
'3' appeared 2 times.
'4' appeared 0 times.
'5' appeared 2 times.
'6' appeared 2 times.
'7' appeared 0 times.
'8' appeared 0 times.
'9' appeared 1 times.
と表示されるようにしたいです。そこで以下のようなプログラムを組みましたが
コンパイルは成功するもexeを実行すると数字入力後エラーメッセージが...続きを読む

Aベストアンサー

がるです。

> しかし何故digit = atoi(&str[i]);はダメで、がるさんの言うように
> 別の配列に入れなおすとうまく行くのでしょうか。
うい。ではちょっと詳細に。

例えば、strに
0123
と入ってるとします。正確には文字の後ろに¥0が入っているので、¥0をnで表現するとして
0123n
となります。
今回取得したいのは、0であったり1であったりといった「数字一桁」になります。
では、i=0の場合の&str[i]を考えて見ます。
str[i]は今回str[0]になるので、文字の先頭は0になります。ただ、atoiは「char *」を引数として期待しているため、当然のように「¥0があるところまで」を数字として取ってきます。
0123n
あれ?
これでは、取りたい数字になりません。
# このあたり、元のソースで、atoiの直後に、printfでdigitの値をprintするとわかります。

で。そのために「一文字だけを格納した別領域」を用意してやります。
それがcwk文字配列になります。

ちなみに、cwkは「char work」の略です(笑
ええあまり推奨できるネーミングではありませんが…便利なので、局所に限ってはたまに使います。特にテスト用のコードの場合。

こんなんで説明になりますでしょうか?

あと。#3さんのおっしゃるようなやり方もありです。ただしそれはASCIIコードなどに依存するので、一応コメントにそんな風に書いておいたほうがよいです(0-9が不連続にマッピングされているコード体系も存在するので)。

がるです。

> しかし何故digit = atoi(&str[i]);はダメで、がるさんの言うように
> 別の配列に入れなおすとうまく行くのでしょうか。
うい。ではちょっと詳細に。

例えば、strに
0123
と入ってるとします。正確には文字の後ろに¥0が入っているので、¥0をnで表現するとして
0123n
となります。
今回取得したいのは、0であったり1であったりといった「数字一桁」になります。
では、i=0の場合の&str[i]を考えて見ます。
str[i]は今回str[0]になるので、文字の先頭は0になります。ただ、atoiは...続きを読む

Qバッファとは何ですか

C言語を使用してるとバッファという言葉がよく出てきますがバッファとは何ですか
メモリとは違うものですか
訳をみても緩衝材とか一時的に蓄える場所という意味でよく分かりません
一時的でない使い方も多い気がしますが実際はどういうものですか

Aベストアンサー

#1です

寝ぼけて適当に書いたので修正。

すぐ見つけることができたもので正確なものは英語版ですがこちらくらいかも。
Data buffer - Wikipedia (en.)
http://en.wikipedia.org/wiki/Data_buffer

一応簡単なものはこちらです。
バッファとは - e-Wrods
http://e-words.jp/w/E38390E38383E38395E382A1.html

「複数の機器やソフトウェアの間でデータをやり取りするときに、処理速度や転送速度の差を補うためにデータを一時的に保存しておく記憶装置や記憶領域のこと。」
が現在の基本定義です。処理速度・転送速度の差のための緩衝材的な意味です。

昔はソフトウェアとハードウェア間に使うデータでソフトウェア側がデータを受け取るか、整形して送信するときに使うメモリ領域が基本的にバッファでした。
マルチプロセッサ・マルチタスクの時代になってくると、ソフトウェア間の処理速度の違いを吸収するために使うメモリ領域にもバッファという言葉が使われるようになりました。ソフトウェア間で逐次(FIFO)処理されるデータのためのメモリ領域がこちらの使われ方の主戦場といったところでしょうか。

ソフトウェア間でただ一括転送されるデータならバッファという言葉は誤用ということになるのですが、よく誤用されます。

#1です

寝ぼけて適当に書いたので修正。

すぐ見つけることができたもので正確なものは英語版ですがこちらくらいかも。
Data buffer - Wikipedia (en.)
http://en.wikipedia.org/wiki/Data_buffer

一応簡単なものはこちらです。
バッファとは - e-Wrods
http://e-words.jp/w/E38390E38383E38395E382A1.html

「複数の機器やソフトウェアの間でデータをやり取りするときに、処理速度や転送速度の差を補うためにデータを一時的に保存しておく記憶装置や記憶領域のこと。」
が現在の基本定義です。処理速度・転送速...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング