無題

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
zino

無題

#1

投稿記事 by zino » 14年前

キーボードで入力した英数字や演算子を表示させるプログラムなのですが、
英字を一文字ずつ出力させるのではなく全部まとめて出力したいのですがどうかけばいいかわかりません。
isalphaの部分です。
お願いします。


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

#define STR_LEN 256
#define BSIZE 1024

char buff[BSIZE];
char *bp;

enum tokentype{PLUS,MINUS,ASTERISK,SLASH,PERCENT,LPAREN,RPAREN,NUMB,END,IDENT};

struct{
enum tokentype type;
int val;
char str[STR_LEN];
}token;

void error(char *msg);
void scan();

void error(char *msg){
if(msg == NULL)
puts("error");
else
puts(msg);
exit(1);
}

void scan(){
token.val=0;
memset(token.str,'\0',STR_LEN);
if(isdigit(*bp)){
token.val=strtol(bp,&bp,10);
sprintf(token.str,"%d",token.val);
token.type = NUMB;
return ;
}
if(isalpha(*bp)){
token.str[0]=*bp;
token.type=IDENT;
bp++;
return ;
}
if(*bp == '+'){
token.str[0] =*bp;
token.type=PLUS;
bp++;
return ;
}
if(*bp =='-'){
token.str[0]=*bp;
token.type=MINUS;
bp++;
return;
}
if(*bp =='*'){
token.str[0]=*bp;
token.type=MINUS;
bp++;
return;
}
if(*bp =='-'){
token.str[0]=*bp;
token.type=ASTERISK;
bp++;
return;
}
if(*bp =='/'){
token.str[0]=*bp;
token.type=SLASH;
bp++;
return;
}
if(*bp =='%'){
token.str[0]=*bp;
token.type=PERCENT;
bp++;
return;
}
if(*bp =='('){
token.str[0]=*bp;
token.type=LPAREN;
bp++;
return;
}
if(*bp ==')'){
token.str[0]=*bp;
token.type=RPAREN;
bp++;
return;
}
if(*bp =='$'){
token.str[0]=*bp;
token.type=END;
bp++;
return;
}

error("unknown token\n");
}
int main(){
fgets(bp=buff,BSIZE,stdin);
while(1){
scan();
printf("TYPE:%3d",token.type);
if(token.type == NUMB)
printf("VAL:%d\n",token.val);
else
printf("STR:%s\n",token.str);
if(token.type==END)
break;
}
return 0;
}

ゆーずぃ

Re:無題

#2

投稿記事 by ゆーずぃ » 14年前

表示したいだけ?なら一文字ずつ判定している意味ってあるんですか?
#include <stdio.h>

void main(void){

    char s[256];
    scanf("%s",s);
    puts(s);
}
とかじゃダメなんですか?

naohiro19

Re:無題

#3

投稿記事 by naohiro19 » 14年前

isalpha関数を使う場合はlocale.hをインクルードしてsetlocaleしなければなりません。

アビゲイル

Re:無題

#4

投稿記事 by アビゲイル » 14年前

ひとつ期待する入力例と出力例を書いてみてはどうですか?

zino

Re:無題

#5

投稿記事 by zino » 14年前

回答ありがとうございます。

aaa11aaa$
という入力に対して
STR:aaa
VAL:11
STR:aaa
STR:$
と出力したいと考えています。

英字が続く場合、次の数字・演算子がみつかるまでは英字を一緒に出力したいです。
うまく伝えられなくてすいません。

アビゲイル

Re:無題

#6

投稿記事 by アビゲイル » 14年前

もう少し直観的にわかりやすい関数があるかもしれませんが、一例を示しますね。
%[a-z]はANSI準基でない為、%[abcdefghijklmnopqrstuvwxyz]としなくてはいけないかもしれません。

if(isalpha(*bp)){ 
        sscanf(bp,"%[a-z]",token.str);
        token.type=IDENT; 
        bp += strlen(token.str);
        return ;

zino

Re:無題

#7

投稿記事 by zino » 14年前

できました。
ありがとうございました。

閉鎖

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