初心者です.

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

初心者です.

#1

投稿記事 by べっち » 7年前

超がつくほどC言語の初心者です.あるプログラムで困っています.
"151"が入力されるまでの任意の数字を入力して,逆順に出力するというプログラムというものなのですが,
for文でもwhile文でも移植性のないポインタ関数と警告が出てしまいます.
NULLなら問題はないのですが終了データが数値の場合どのようにすればよいのでしょうか.ご教授のほどよろしくお願いします.

zxc
記事: 79
登録日時: 8年前
住所: 日本の背骨(?)あたり

Re: 初心者です.

#2

投稿記事 by zxc » 7年前

  言葉だけで説明するよりも、コードを載せたほうが絶対に分かりやすいですよね。警告なんかも識別できるナンバーごとコピーペーストするのがベターだと思います。  コードを載せる場合はコードタグをご利用ください。

初級者
記事: 200
登録日時: 9年前

Re: 初心者です.

#3

投稿記事 by 初級者 » 7年前

参考になるかどうかは不明です。

コード:

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

void printReverseNumber(char *s)
{
    if (!*s) {
        return;
    }
    else if (isdigit(*s)) {
        printReverseNumber(s + 1);
        putchar(*s);
    }
}

int main(void)
{
    char str[80];   // サイズは適切に定義すること

    while (1) {
        printf("数字列を入力(151を入力すると終了) > ");
        scanf("%s", str);
        if (strcmp(str, "151") == 0) {
            break;
        }
        printReverseNumber(str);
        putchar('\n');
    }
    return 0;
}

アバター
バグ
記事: 130
登録日時: 9年前
住所: 愛媛県
連絡を取る:

Re: 初心者です.

#4

投稿記事 by バグ » 7年前

うーん・・・いまいち何をしたいのかよくわからないけど、こういうことかな?

コード:

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

void printReverseNumber(char* str, int len)
{
	if (--len >= 0)
	{
		char c = *(str + len);
		if (isdigit(c)) putchar(c);
		printReverseNumber(str, len);
		return;
	}
	putchar('\n');
}

int main(void)
{
	char str[80];   // サイズは適切に定義すること

	while (1)
	{
		printf("数字列を入力(151を入力すると終了) > ");
		scanf("%s", str);
		if (strcmp(str, "151") == 0) break;
		printReverseNumber(str, strlen(str));
	}
	return 0;
}

べっち

Re: 初心者です.

#5

投稿記事 by べっち » 7年前

ソースも載せるべきでした.申し訳ありません.string.hは使わないように組みたいです.
このプログラムで改善したいところは,①ここのNULLを数値にしたい(151で終了)②入力した文字(数値)を並べて最後にすべて逆順に表示する
という2点です.このままこのプログラムを使うと最後に入力した文字のみが反転されます.
当方C言語初めてまもなくなので変なことを言っているかもしれませんが,ご教授よろしくお願いします.

コード:

# include <stdio.h>

main()
{
	char s[80];
	int i,n=0;

	printf("入力文字:");
	while(gets(s) != NULL){
		printf("入力文字:");
		n++;
    }
	
    for(i=n;i>-1;i--){
	printf("%c",s[i]);
    }
	
    return(0);
}

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

Re: 初心者です.

#6

投稿記事 by みけCAT » 7年前

NULLの代わりに0を使えば数値にできます。
151で終了するには、

コード:

if(s[0]=='1' && s[1]=='5' && s[2]=='1' && s[3]==0)
という条件文を使えばできます。

文字列を反転するには
1.文字列を走査して最後のNUL文字まで行く
2.そこから1文字戻る
3.その位置の文字を出力し、1文字戻る
4.先頭の文字を出力したら終了
これで半角文字しか入力されないのならいけます。全角の文字が含まれるとちょっと複雑です。
これをgetsしているwhileループの中で実行します。

コード:

#include <stdio.h>

int main(void) {
	char s[80];
	int i;

	printf("入力文字:");
	while(fgets(s,sizeof(s),stdin) != 0) {
		for(i=0;s[i];i++) {
			if(s[i]=='\n') {
				s[i]=0;
				break;
			}
		}
		if(s[0]=='1' && s[1]=='5' && s[2]=='1' && s[3]==0)break;
		for(i--;i>=0;i--)putchar(s[i]);
		putchar('\n');
		printf("入力文字:");
	}

	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 1746
登録日時: 9年前

Re: 初心者です.

#7

投稿記事 by box » 7年前

べっち さんが書きました:

コード:

	while(gets(s) != NULL){
		printf("入力文字:");
		n++;
    }
1回の文字列入力でnは1しか増えていないです。
string.hを使いたくない(という、私からすれば奇妙な制約)のでしたら、
何とかして自力で文字数をカウントする必要があります。
と書いているうちに、みけCATさんから「自力で文字数をカウントするバージョン」が
出ていましたね。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

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

Re: 初心者です.

#8

投稿記事 by みけCAT » 7年前

べっち さんが書きました:string.hは使わないように組みたいです.
自分でstrcmpを実装するのも手です。

コード:

#include <stdio.h>

int mystrcmp(const char* a,const char* b) {
	while(*a && *b && *a==*b){a++;b++;}
	if(*a>*b)return 1;
	if(*a<*b)return -1;
	return 0;
}

int main(void) {
	char s[80];
	int i;

	printf("入力文字:");
	while(fgets(s,sizeof(s),stdin) != 0) {
		for(i=0;s[i];i++) {
			if(s[i]=='\n') {
				s[i]=0;
				break;
			}
		}
		if(mystrcmp(s,"151")==0)break;
		for(i--;i>=0;i--)putchar(s[i]);
		putchar('\n');
		printf("入力文字:");
	}

	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: 初心者です.

#9

投稿記事 by みけCAT » 7年前

ついでに他の関数も実装すると、勉強になるかもしれません。

コード:

#include <stdio.h>

int mystrcmp(const char* a,const char* b) {
	while(*a && *b && *a==*b){a++;b++;}
	if(*a>*b)return 1;
	if(*a<*b)return -1;
	return 0;
}

char* mystrchr(const char* s,int c) {
	while(*s && *s!=c)s++;
	return (*s || c==0)?s:NULL;
}

int mystrlen(const char* s) {
	int count;
	for(count=0;*s;count++)s++;
	return count;
}

int main(void) {
	char s[80];
	int i;

	printf("入力文字:");
	while(fgets(s,sizeof(s),stdin) != 0) {
		char* c=mystrchr(s,'\n');
		if(c)*c=0;
		if(mystrcmp(s,"151")==0)break;
		for(i=mystrlen(s)-1;i>=0;i--)putchar(s[i]);
		putchar('\n');
		printf("入力文字:");
	}

	return 0;
}
最後に編集したユーザー みけCAT on 2013年2月21日(木) 11:01 [ 編集 1 回目 ]
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: 初心者です.

#10

投稿記事 by みけCAT » 7年前

わざわざ実装しなくても、プロトタイプ宣言をすればstring.hをインクルードすることなく関数を利用できます。

コード:

#include <stdio.h>

size_t strlen(const char* s);
int strcmp(const char* s,const char* t);
char* strchr(const char* s,int c);

int main(void) {
	char s[80];
	int i;

	printf("入力文字:");
	while(fgets(s,sizeof(s),stdin) != 0) {
		char* c=strchr(s,'\n');
		if(c)*c=0;
		if(strcmp(s,"151")==0)break;
		for(i=strlen(s)-1;i>=0;i--)putchar(s[i]);
		putchar('\n');
		printf("入力文字:");
	}

	return 0;
}
オフトピック
推奨されませんが、C言語ならプロトタイプ宣言をしなくても関数を利用できるはずです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: 初心者です.

#11

投稿記事 by みけCAT » 7年前

もしかして、やりたいことはこれですか?

コード:

#include <stdio.h>

char* safer_gets(char* s,int size) {
	int i;
	if(!fgets(s,size,stdin))return NULL;
	for(i=0;s[i];i++) {
		if(s[i]=='\n') {
			s[i]=0;
			break;
		}
	}
	return s;
}

char* mystrcat(char* s,const char* t) {
	char* return_s=s;
	while(*s)s++;
	while(*t) {
		*(s++)=*(t++);
	}
	*s=0;
	return return_s;
}

size_t mystrlen(const char* s) {
	size_t len;
	for(len=0;*s;s++)len++;
	return len;
}

int main(void) {
	char s[80]={0};
	char buf[80];
	int i;
 
	printf("入力文字:");
	while(safer_gets(buf,sizeof(buf)) != 0) {
		if(buf[0]=='1' && buf[1]=='5' && buf[2]=='1' && buf[3]==0)break;
		mystrcat(s,buf);
		printf("入力文字:");
	}

	for(i=mystrlen(s)-1;i>-1;i--) {
		printf("%c",s[i]);
	}
	putchar('\n');

	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

べっち

Re: 初心者です.

#12

投稿記事 by べっち » 7年前

非常に詳細に教えていただきありがとうございます.
このプログラムは教材の問題で(string.hを使わないのもそのためです.)答えがないので悩んでおりました.
やりたいことは,みけCATさんの最後に書かれたものです.うまく伝えられなくて申し訳ありませんでした.
教材は基礎のものなのでまさかこんなに長いプログラムになるとは思いませんでした.C言語は奥が深いですね.

答えていただいた皆様ありがとうございました.

閉鎖

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