下記のように(色々端折ってはありますが)した時、例として一文字ずつ「A,A,A,1,2,3」と入力したら、「1,2,3」は文字として扱われていると思っています。しかし「AAA」と「123」という風に数値として表わしたくて、[>>]の部分で変換できるようにしてみたのですが…
[x,x,x,9,9,9]と入力→[xxx231]と出力
[x,x,x,3,3,6]と入力→[xxx80]と出力
[x,x,x,4,0,0]と入力→[xxx144]と出力
という風に、全く関係のない数値として出てきてしまいます。
どうしたらいいのかわからなくなってしまったので、どなたかヒントを頂けないでしょうか。お願いします。
while(1){
____uchar a,c,COM_RW[7],IDall[3];
____ulong ID2=0;
____for(a=0;a<7;a++){
________c=getc();
________printf("%c",c);
____}
____switch(COM_RW[0]){
________case 'W': //WRITE Command
____________if(COM_RW[2]=='I'){
____________COM_RW[6]='\0';
____________if(isxdigit(COM_RW[3])){
________________for(i=0,j=3;j<6;j++,i++)
____________________IDall[i]=COM_RW[j];
________>>______if(!isdigit(IDall[2])){
________>>__________ID2=(IDall[0]-'0')*10;
________>>__________ID2+=IDall[1]-'0';
________>>______}else{
________>>__________ID2=(IDall[0]-'0')*100;
________>>__________ID2+=(IDall[1]-'0')*10;
________>>__________ID2+=IDall[2]-'0';
________________}
__以下略。

A 回答 (3件)

>ccscのcコンパイラ



同じものが手元にありませんので、手元のgcc Ver.3.4.5を使って、
下記のコードを書いてみました。
すると、
W?I999
という入力に対しては
W?I999
999

W?I400
という入力に対しては
W?I400
400

という風に、十進数として扱いたい部分を正しい値で認識できました。
コンパイラの違いなのか、文字コード体系の違いなのか、
それとも別のことが原因なのか、残念ながらわかりませんでした。


#include <stdio.h>

int main(void)
{
unsigned char a, COM_RW[7], IDall[3];
unsigned long ID2 = 0;
int i, j;

for (a = 0; a < 7; a++) {
COM_RW[a] = (unsigned char) getchar();
printf("%c", COM_RW[a]);
}

switch (COM_RW[0]) {
case 'W' : //WRITE Command
if (COM_RW[2] == 'I') {
COM_RW[6] = '\0';
if (isxdigit(COM_RW[3])) {
for (i = 0, j = 3; j < 6; j++, i++) {
IDall[i] = COM_RW[j];
}
if (!isdigit(IDall[2])) {
ID2 = (IDall[0] - '0') * 10;
ID2 += IDall[1] - '0';
} else {
ID2 = (IDall[0] - '0') * 100;
ID2 += (IDall[1] - '0') * 10;
ID2 += IDall[2] - '0';
}
printf("%ld\n", ID2);
}
}
break;
default:
break;
}
return 0;
}
    • good
    • 0
この回答へのお礼

コードを試して頂いていたんですね!!
ほぼこのままで動く、ということがわかっただけでもありがたいです。
コンパイラの違いなのかなんなのか…
もう一度関数(getc()等)を見直してみます。前はこれで動いたんですけどね…

わざわざありがとうございます!

お礼日時:2009/05/22 23:59

>[x,x,x,9,9,9]と入力→[xxx231]と出力



提示されたコード断片には出力箇所がありません。
よって、

>__以下略。

で省略された箇所に問題があるかもしれません。
どうにも判断がつきませんので、出力箇所も見せていただけますか?

ところで、

>________c=getc();

このgetc()は標準関数ですか?
標準関数ならば、引数でファイルポインタを指定する必要があるのですけれど…。

この回答への補足

すみません、出力も消していたようです…
printf("%ld",ID2);
で出力しています。あ、もしかして符号の有無が関係するのでしょうか…

getc()については、組み込み?とかいうやつです。標準とは違うのでしょうか?
ccscのcコンパイラを使っています。

補足日時:2009/05/22 22:36
    • good
    • 0

COM_RW[]


には、どこで値をセットしているのでしょうか?

この回答への補足

あ…すみません、最初のforの中でセットしてます。
for(a=0;a<7;a++){
c=getc();
COM_RW[a]=c;
printf("%c",c);
}
消してたみたいです;

補足日時:2009/05/22 19:54
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング

おすすめ情報