ページ 11

char型の配列について質問です

Posted: 2013年10月13日(日) 21:14
by カレー
#include<stdio.h>
#include<windows.h>
#define MAX_LENGTH 30
void main ()
{
char str[MAX_LENGTH];
char answer[MAX_LENGTH];
int cCount = 0;

printf("input numeric string:");
scanf("\n%s",str);

//マイナスから入力されたときのflg
if(str[cCount]=='-')
{
answer[cCount] = str[cCount];
cCount++;
}

while(str[cCount])
{
printf("%d\n",str[cCount]);

//文字か数字か判定・数字がアクティブな配列に来る限り数字をanswerに格納
if(str[cCount]>48 && str[cCount]<57)
{
answer[cCount] = str[cCount];
cCount++;
}
//文字が来たら終了
else
{
break;
}
}
//出来上がった数字の文字列を出力
printf("Changed \"%s\" to %s",str,answer);
Sleep(10000);
}

教科書の課題を進めていたのですが
問題の内容が「最大30文字の数字列を入力させ、数値に変換して出力するプログラムを作成せよ
          尚、数字以外の文字列が含まれていた場合は、その文字列前に格納されている文字列を変換の対象としてください
          先頭文字が'-'の場合は負の値として変換してください」とのことでした
早速作ってみたのですがanswer[]の配列に11行目のscanf("\n%s",str);が入ってしまいます
最後の出力結果でanswerの出力結果には 代入された値フフフフフフフフフフフフフフフフフstrの文字列 が出力されてしまいます
どうすれば代入された値だけ出力することができるのでしょうか

Re: char型の配列について質問です

Posted: 2013年10月13日(日) 22:30
by box
「数値に変換する」というのが主題であるプログラムにおいて、
変換した後の「数値」を格納するための変数(int型か何か)を用意していないのは
まずいのではないでしょうか。

例えば、"123a"
という入力を受け取って、「ひゃくにじゅうさん」という「数値」に変換する処理を
「コンピューターを使わずに手で」行なう際、どのようにしますか?

boxさんの言われたとおりint型の変数に格納してみました

Posted: 2013年10月14日(月) 00:05
by カレー
#include<stdio.h>
#include<windows.h>
#define MAX_LENGTH 30
void main ()
{
char str[MAX_LENGTH+1];
int answer=0;
int tfFlg =1;
int cCount = 0;

printf("input numeric string:");
scanf("\n%s",str);

//マイナスから入力されたときのflg
if(str[cCount]=='-')
{
tfFlg= tfFlg*-1;
cCount++;
}
while(str[cCount])
{
printf("%d\n",str[cCount]);

//文字か数字か判定・数字がアクティブな配列に来る限り数字をanswerに格納
if(str[cCount]>48 && str[cCount]<57)
{
answer = answer + str[cCount]-48;
answer=answer*10;
cCount++;
}
else if(str[cCount]=='0')
{
answer = str[cCount];
break;
}
//文字が来たら終了
else
{
break;
}
}
//+-を指定
answer = tfFlg*answer;
//出来上がった数字の文字列を出力/桁数調整
printf("Changed \"%s\" to %d",str,answer/10);
Sleep(3000);
}

コード:

boxさんの言われた通りint型の変数に順番に入れて出力したところ問題なく出力できました、ありがとうございました
しかし前回コーディングした配列Aに配列Bの値を順番に入れていくという方法の出力結果がうまくいかなかった理由が未だにわかりません、何故なんでしょうか。

自己解決しました

Posted: 2013年10月14日(月) 00:23
by カレー

コード:

if(str[cCount]>48 && str[cCount]<57)
{
answer[cCount] = str[cCount];
cCount++;
}
answer[cCount]=0;

配列の最後の値がnullにしていなかったため出力が上手くいかなかったみたいです
配列の基本の部分でした、大変失礼いたしました。

ヒントをくださってありがとうございました。