掲示板利用宣言

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

 私は

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

掲示板2

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

No.25452

文字列比較
投稿者---P2P(2006/01/18 01:52:10)


構造体に個人情報を入れいれた内容を表示するプログラムです。
実行した結果エラーがでました。
おそらく原因は文字列に対するポインタのところだと思うんですが、
どこがまちがっているのでしょうか?
ただしく動作させるにはどこを変更すればよいのでしょうか?
どなたかおしえていただけないでしょうか?
文字列のポインタを配列に置き換えるとできます。
配列を使った場合とポインタを使った場合の違いってなんなのでしょうか?


#include<stdio.h>
    
struct student{
    int number;
    char *id;
    char *sex;
    char *pc;
}s;

struct name{
    char *first_name;
    char *second_name;
}n;

struct Rname{
    char *Rfirst_name;
    char *Rsecond_name;
}R;

struct birthday{
    int year;
    int manth;
    int day;
}b;

int main()
{
    printf("学籍番号(下7桁): ");
    scanf("%d", &s.number);
    printf("名前(姓 名): ");
    scanf("%s %s", &n.first_name, &n.second_name);
    printf("ローマ字名(姓 名): ");
    scanf("%s %s", &R.Rfirst_name, &R.Rsecond_name);
    printf("誕生日(○/○/○): ");
    scanf("%d/%d/%d", &b.year, &b.manth, &b.day);
    printf("ユーザID: ");
    scanf("%s", &s.id);
    printf("性別: ");
    scanf("%s", &s.sex);
    printf("パソコン: ");
    scanf("%s", &s.pc);
    printf("\n");
    printf("-----------------------------------\n");
    printf("\n\n学籍番号: %d\n", s.number);
    printf("名前: %s%s\n", n.first_name, n.second_name);
    printf("ローマ名: %s%s\n", R.Rfirst_name, R.Rsecond_name);
    printf("誕生日: %d/%d/%d\n", b.year, b.manth, b.day);
    printf("ユーザID: %s\n", s.id);
    printf("性別: %s\n", s.sex);
    printf("パソコン: %s\n", s.pc);
    return 0;
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:文字列比較 25453 si 2006/01/18 01:57:55
<子記事> Re:文字列比較 25455 RAPT 2006/01/18 02:02:42
<子記事> Re:文字列比較 25456 si 2006/01/18 02:12:23


No.25453

Re:文字列比較
投稿者---si(2006/01/18 01:57:55)


struct name{
char *first_name; <- 文字列へのポインタ
char *second_name;
}n;

scanf("%s %s", &n.first_name, &n.second_name);<- ポインタエリアに文字をコピーしている。


この投稿にコメントする

削除パスワード

No.25454

構造体
投稿者---P2P(2006/01/18 02:00:42)


なるほど。
ってことはポインタエリアってのはアドレスが格納されているところ?


この投稿にコメントする

削除パスワード

No.25457

Re:構造体
投稿者---kz3(2006/01/18 09:28:22)



>なるほど。
>ってことはポインタエリアってのはアドレスが格納されているところ?

「ポインタエリア」というのがいまいち意味を読み取れなかったけど、こういうことです。

#include <stdio.h> int main( void ) { int n = 0x12345678; int *pn; int **ppn; printf( " &n = 0x%p\n", &n ); printf( " n = 0x%08x\n", n ); pn = &n; printf( " &pn = 0x%p\n", &pn ); printf( " pn = 0x%p\n", pn ); printf( " *pn = 0x%08x\n", *pn ); ppn = &pn; printf( " &ppn = 0x%p\n", &ppn ); printf( " ppn = 0x%p\n", ppn ); printf( " *ppn = 0x%p\n", *ppn ); printf( "**ppn = 0x%08x\n", **ppn ); return 0; }



この投稿にコメントする

削除パスワード

No.25455

Re:文字列比較
投稿者---RAPT(2006/01/18 02:02:42)


まず最初に環境を書いてください。

>実行した結果エラーがでました。
どんなエラーですか。エラー内容をコピペしてください。


char buff1[100];
scanf("%s", buff1); // &buff1[0] でもOK

は正しいコードです。

char *buff2;
scanf("%s", buff2);
は文法は合っていますが、正しくないコードです。
なぜなら、ポインタ buff2 の指す先は不定で、その不正な領域に
書き込もうとしているからです。

char *buff3 = NULL;
buff3 = malloc(100);
scanf("%s", buff3);
free(buff3);
は正しいコードです。




この投稿にコメントする

削除パスワード

No.25456

Re:文字列比較
投稿者---si(2006/01/18 02:12:23)


>配列を使った場合とポインタを使った場合の違いってなんなのでしょうか?

char buf[128]; <- 128文字分のメモリが確保される。
(bufは、文字列の先頭メモリアドレス)
char *s; <- ポインタサイズ分のメモリしか確保されない。
(変数sは、文字列のあるメモリアドレスを指すもの)


この投稿にコメントする

削除パスワード

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