C言語のint型の割り算

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Salt
記事: 2
登録日時: 3ヶ月前

C言語のint型の割り算

#1

投稿記事 by Salt » 3ヶ月前

コード:

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

int main(){
    int a;//数入力
    int z;
    char *b;
    char d;
    printf("数を入力\n");
    scanf("%d",&a);//①
    b = (char*)malloc(sizeof(char) * a + 1);//入力された数の文字を入力できるメモリを確保する
    printf("文字列を入力\n");
    scanf("%s",&d);
    strcpy(b,&d);
    printf("%c\n",*b);
    z= a/2;//②
    printf("%d\n",&a);//③
    printf("%d\n",&z);//④
    free(b);
    return 0;
}
このコードはあるプログラミングの一部です。配列の操作をしていて、ある操作がどうしてもうまくいかず、その原因が①で入力された数が②③④で入力された数値とは全く違う数値になっていることだと判明しました。
例えばaに5を入力したところ、③では6422036④では6422032と出力されており、③と④の差から、これはaのアドレス値が出力されているのでは?とも考えましたが、その原因がわかりません。
よろしければ、どこにミスがあるのか教えていただきたいです。私の望む形は、
③に入力された値が④にはそれを2で割った数値が(小数点以下切り捨て)出力されるというものです。

Salt
記事: 2
登録日時: 3ヶ月前

Re: C言語のint型の割り算

#2

投稿記事 by Salt » 3ヶ月前

すみません、③と④のところの&はついていなかったです。ですが、それでも出力される値が入力された値とは程遠いものが出力されてしまいます

アバター
usao
記事: 1635
登録日時: 7年前

Re: C言語のint型の割り算

#3

投稿記事 by usao » 3ヶ月前

(1)aを入力した直後の箇所にてaの値をprintfなりで確認してください.入力した値が出力されますか?
(2)文字列入力する処理は全く不要だと思うので,それ関連(変数bやdに関する記述)を一度全て取っ払ってください.
それでも出力結果は異常なままですか?
(3) (2)で出力結果が改善する場合,&dに対するscanfあたりがやらかしているのではないか? とか想像します.

アバター
みけCAT
記事: 6389
登録日時: 10年前
住所: 千葉県
連絡を取る:

Re: C言語のint型の割り算

#4

投稿記事 by みけCAT » 3ヶ月前

コード:

    char d;
    scanf("%s",&d);
これはダメですね。
dには1文字分の領域しか無く、それは終端のナル文字で使うため、0文字までの文字列しか入力できません。
1文字以上の文字列を入力してしまうと、範囲外への書き込みを起こし、周辺のデータの破壊に繋がります。
今回の場合、dはこのあと使われていないので、
dを経由せずに直接bが指す領域に対して文字列を入力した方がいいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 1760
登録日時: 10年前

Re: C言語のint型の割り算

#5

投稿記事 by box » 3ヶ月前

コード:

// 変数bとdの役割がよくわからないので、削除しました

#include <stdio.h>

int main(void)
{
    int a;

    printf("数を入力\n");
    scanf("%d", &a);
    printf("%d\n", a);
    printf("%d\n", a / 2);
    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

返信

“C言語何でも質問掲示板” へ戻る