掲示板利用宣言

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

 私は

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

掲示板2

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

No.25856

ポインタの演算について
投稿者---Gen(2006/01/30 23:32:25)


こんばんは。

今、「data.html」というファイルを読み込み、
このファイルに書かれている、imgタグのファイル名を上から3つ取得するプログラムを書いています。

以下がそのソースです。

一応、コンパイルWinXP+BCC5.51では動作も確認しているのですが、
Linux+GCCの環境では、data+iの箇所をdata[i]にするとコンパイル時に警告が出ます。

「整数とポインタを比較している」といった内容の警告なのですが、
これをdata+iにすると問題なくコンパイルが通ります。

data+iとdata[i]は同じ意味だと思うのですが、
何か異なるのでしょうか?
また、以下のプログラムに何か問題がありますでしょうか?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>

/* イメージ取得開始タグ */
#define IMG_TAG "src=img/"
/* イメージ取得数 */
#define MAX_IMG_NUM 3

#define SUCCESS 0
#define ERROR 1

int getWeatherHtml(char **weatherHtml);
int getWeatherData(char **weatherHtml, char ***weatherData, int *n);



/* HTMLファイルを読み込む */
int main(void) {
    int i = 0;
    int n = 0;
    int ret = SUCCESS;
    int check = SUCCESS;
    char *weatherHtml = NULL;
    char **weatherData = NULL;

    /* HTMLデータを取得 */
    check = getWeatherHtml(&weatherHtml);

    /* HTMLの取得に失敗した場合は異常終了 */
    if (check == ERROR || weatherHtml == NULL) {
        ret = ERROR;
        goto EXIT;
    }

    /* 取得したHTMLデータからイメージの箇所を抜き取る */
    check = getWeatherData(&weatherHtml, &weatherData, &n);
    if (check == ERROR || weatherData == NULL) {
        ret = ERROR;
        goto EXIT;
    }

    /* 取得したデータの表示 */
    for (i = 0; i < n; i++) {
        printf("%d = %s\n", i, weatherData[i]);
    }


EXIT:;
    /* 確保領域を開放 */
    if (weatherHtml != NULL) {
        free(weatherHtml);
    }
    for (i = 0; i < MAX_IMG_NUM; i++) {
        if (weatherData[i] != NULL) {
            free(weatherData[i]);
        }
    }
    if (weatherData != NULL) {
        free(weatherData);
    }

    return ret;
}



/* HTMLデータを取得 */
int getWeatherHtml(char **weatherHtml) {
    char fname[] = "data.html";
    char *work = NULL;
    int len = 0;
    int ret = SUCCESS;
    FILE *fp = NULL;
    struct stat st;

    /* ファイルのオープン */
    if ((fp = fopen(fname, "r")) == NULL) {
        fprintf(stderr, "%s を開けません。\n", fname);
        ret = ERROR;
        goto EXIT_2;
    }

    /* ファイルの存在チェック */
    if (stat(fname, &st) != 0) {
        fprintf(stderr, "%s が見つかりません。\n", fname);
        ret = ERROR;
        goto EXIT_2;
    }

    /* ファイルの内容を取得 */
    len = st.st_size;
    work = (char *)calloc(1, len+1);
    if (fread(work, len, 1, fp) < 1) {
        fprintf(stderr, "%s の読み込みに失敗しました。", fname);
        ret = ERROR;
        goto EXIT_2;
    }
    *weatherHtml = work;

EXIT_2:;
    /* 確保領域を開放 */
    if (fp != NULL) {
        fclose(fp);
    }

    return ret;
}



/* 取得したHTMLデータからイメージの箇所を抜き取る */
int getWeatherData(char **weatherHtml, char ***weatherData, int *n) {
    char *data = *weatherHtml;
    char **work = NULL;
    int i = 0;
    int num = 0;
    int startTag = 0;
    int endTag = 0;
    int ret = SUCCESS;

    work = (char **)calloc(MAX_IMG_NUM, sizeof(char *));

    /* ファイルの読み出し */
    while ( data+i != NULL ) {
        if (strncmp(data+i, IMG_TAG, strlen(IMG_TAG)) == 0) {
            startTag = endTag = i;
            while (data[endTag++] != ' ') {
                ;
            }
            endTag--;
            if (MAX_IMG_NUM <= num) {
                goto EXIT_3;
            }
            work[num] = (char *)calloc(1, endTag-startTag+1);
            strncpy(work[num], data+startTag+strlen(IMG_TAG), endTag-startTag-strlen(IMG_TAG));
            num++;
        }
        i++;
    }

EXIT_3:;
    *weatherData = work;
    *n = num;
    
    return ret;
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ポインタの演算について 25857 iijima 2006/01/31 00:00:22


No.25857

Re:ポインタの演算について
投稿者---iijima(2006/01/31 00:00:22)


> data+iとdata[i]は同じ意味だと思うのですが、

違います。
data+iはポインタ、data[i]はdata+iが指す値です。
敢えて言うなら、*(data+i)とdata[i]が同じです。



この投稿にコメントする

削除パスワード

No.25858

Re:ポインタの演算について
投稿者---Gen(2006/01/31 00:27:44)


返信ありがとうございます。

> data+iはポインタ、data[i]はdata+iが指す値です。
> 敢えて言うなら、*(data+i)とdata[i]が同じです。

なるほど。
ありがとうございます。


この投稿にコメントする

削除パスワード

No.25859

Re:ポインタの演算について
投稿者---nop(2006/01/31 00:50:46)


> 敢えて言うなら、*(data+i)とdata[i]が同じです。

あえて言わなくても、

 data[i]



 *(data+i)

のシンタックスガーな訳で。


この投稿にコメントする

削除パスワード

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