←検索窓の楽しみ方
  ショッピングモール  掲示板ランキング


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.4746

ポインタについて
投稿者---tana(2005/10/17 01:30:36)


5桁以下の文字(数字を除く)と5桁以下の数字からなる文字列(例えば TARO1970) を入力して(必ず、文字の固まりの次に数字の固まりがあると仮定)、これを分解して、文字部分を文字配列へ、数字部分を整数型の変数へ格納して、それぞれを標準出力へ出力するプログラムを書着たいんですが、文字列の分解にポインタ変数を用いらなければならない場合どのように書けばよいでしょうか。したにあるプログラムは、入力した文字列を表示して文字数を出力するプログラムです。このプログラムを発展させて書きたいんですが・・・



#include<stdio.h>
#include<malloc.h>
#include<string.h>
int main()
{

int i,len;
char *ptr;


printf("文字列を入力してください\n");
printf("メモリ確保開始\n");
ptr = (char *)malloc(sizeof(char)*100);
printf("メモリ確保終了\n\n");
scanf("%s", ptr);
len = strlen(ptr);


printf("入力された文字----");
for(i=1;i<=len;i++){
printf("%c",*ptr);

ptr++;
}

printf("\nメモリ開放開始\n");
free(ptr);
printf("メモリ開放終了\n");
return 0;
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ポインタについて 4748 Blue 2005/10/17 01:50:24
<子記事> Re:ポインタについて 4752 まきじ 2005/10/17 08:03:29
<子記事> Re:ポインタについて 4755 shu 2005/10/17 12:07:29


No.4748

Re:ポインタについて
投稿者---Blue(2005/10/17 01:50:24)


このプログラムは正常に動きますでしょうか?

freeではmallocで取得したポインタを指定しないといけないのですが、
あなたのプログラムでは、文字列長分ポインタをずらしています。
free関数

この問題を解決するには、char*型の変数をもうひとつ用意して、
mallocの戻り値を保持する変数と、文字列を表示する作業用変数とすればいいです。

もっとも、
> for(i=1;i<=len;i++){
> printf("%c",*ptr);
>
> ptr++;
> }
printf( "%s", ptr );
とすれば、for文も、strlenもいらないですが。

本題ですが、
> 5桁以下の文字(数字を除く)と5桁以下の数字からなる文字列
てことならば、先頭から文字がなんなのかチェックして、別の変数に格納するような処理になります。

ここらへんの関数を参考にしてください。
7−2.文字処理関数

チェックの仕方は、
> for(i=1;i<=len;i++){
> printf("%c",*ptr);
>
> ptr++;
> }
と同じような感じです。



この投稿にコメントする

削除パスワード

No.4750

Re:ポインタについて
投稿者---Blue(2005/10/17 02:53:42)


> 5桁以下の文字(数字を除く)と5桁以下の数字からなる文字列
ならば、string.hのstrcspn関数を使ったほうが簡単かも。

  1. strcspnで数字を含まない長さを取得
  2. strncpyで先頭の5桁以下の文字列を取得(先頭から1で得た文字数分コピー)
  3. atoi(strtol)で後ろの数値を取得(開始位置をずらす)



この投稿にコメントする

削除パスワード

No.4751

Re:ポインタについて
投稿者---tana(2005/10/17 07:25:29)


なんとなくは書けたのですが、数字部を配列に入れて表示する部分(下記プログラムのコメント部)がうまくいきません・・・。どのように書いたらいいですか?



#include<stdio.h>
#include<string.h>
#include<malloc.h>

int atoi(char *);
int main(void)
{
char *ptr,*ptr1;
char num[] = "1,2,3,4,5,6,7,8,9,0";
char *chara;
int i,len,*number;

printf("文字列を入力してください(最大10文字まで)\n");
printf("メモリ確保開始\n");
ptr = (char *)malloc(sizeof(char)*11);
scanf("%s", ptr1);

len = strcspn(ptr1,num);

printf("%sに%sが含まれない長さは%dです。\n",ptr1,num,len);

for(i=1;i<=len;i++){
chara = ptr1;
printf("%c",*chara);
ptr1++;
}
/*
for(i=len+1;i<=*ptr1;i++){
number=atoi(ptr1);
printf("%d",*number);
ptr1++;
}
*/

printf("\n\nメモリ開放開始\n");
free(ptr);
printf("メモリ開放終了\n");
return 0;
}



この投稿にコメントする

削除パスワード

No.4753

Re:ポインタについて
投稿者---Blue(2005/10/17 08:40:10)


ざっとみたところ
>int atoi(char *);
は
#include <stdlib.h>

> char num[] = "1,2,3,4,5,6,7,8,9,0";
は
char num[] = "0123456789";

> for(i=1;i<=len;i++){
> chara = ptr1;
> printf("%c",*chara);
> ptr1++;
> }
は
chara = malloc( len + 1 );
strncpy( chara, ptr, len );
chara[ len ] = '\0';
printf( "%s\n", chara );
// どこかでメモリ解放
free( chara );

> int i,len,*number;
は
int i, len, number;

> /*
> for(i=len+1;i<=*ptr1;i++){
> number=atoi(ptr1);
> printf("%d",*number);
> ptr1++;
> }
> */
は
number = atoi( ptr + len );
printf( "%d\n", number );

ですね。

それと、ソースは他人が読むことを考えてブロックごとにインデントすべきです。



この投稿にコメントする

削除パスワード

No.4752

Re:ポインタについて
投稿者---まきじ(2005/10/17 08:03:29)


マルチポストは駄目ですよ。

# マルチポスト先で既に回答でてるし・・


この投稿にコメントする

削除パスワード

No.4755

Re:ポインタについて
投稿者---shu(2005/10/17 12:07:29)


とりあえずmalloc()やscanf()など、
問題とは直接関係なさそうなものをはぶいた、
参考になるかもしれないプログラム

//
//  配列で、ポインタで……
//

//
#include <stdio.h>

//
//
int main( void )
{
    char sample[] = "TARO1970", *p;
    int i;
    
    //
    for (i = 0; sample[i] != '\0'; i++)
        putchar( sample[i] );
    
    //
    for (p = sample; *p != '\0'; p++)
        putchar( *p );
    
    return 0;
}



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity