関数の問題について

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

関数の問題について

#1

投稿記事 by masechin » 9年前

こんばんは。今文字列sを逆向きに並べる関数reverse(s)を書けという問題をやっているのですが
いくらやっても答えが出てこないことに困っています。C言語初心者で関数が苦手ですのでご教授
お願いします。
考え方としては
int getlineで配列sに文字列を入れて
void copyでlineをlongestにコピーして
reverseでlongestを逆向きにしてline2に入れていると考えています。

コード:

#include<stdio.h>
#define MAXLINE 1000

int getline(char line[],int maxline);
void copy(char to[],char from[]);
void reverse(char x[], char y[]);

main()
{
	int len;
	char line[MAXLINE];
	char longest[MAXLINE];
	char line2[MAXLINE];

	while((len = getline(line,MAXLINE)) > 0){
		copy(longest,line);
		reverse(line2,longest);
		}

		printf("%c",line2);

		return 0;
}

int getline(char s[],int lim)
{
	int c,i;

	for(i = 0; i<lim -1 && (c = getchar()) != EOF && c !='\n';++i)
		s[i] = c;
	if(c =='\n'){
		s[i] = c;
		++i;
	}
	s[i] = '\0';
	return i;
}

void copy(char to[],char from[])
{
	int i;

	i = 0;
	while((to[i] = from[i]) !='\0')
		++i;
	}

void reverse(char x[], char y[])	//xが逆向きに入れる箱での中身でyがlongestの中身
{
	int i,s,max;
	max = 50;
	s = 0;

	for(i= max; i > 0 ; --i)
		x[s] = y[i];
		++s;
	}

box
記事: 2002
登録日時: 14年前

Re: 関数の問題について

#2

投稿記事 by box » 9年前

単に逆順に出力すればいいだけなら…

コード:

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

void reverse(char *s)
{
    int i;

    for (i = strlen(s) - 1; i >= 0; i--) {
        putchar(s[i]);
    }
    putchar('\n');
}

int main(void)
{
    char s[] = "abcdefghijklmnopqrstuvwxyz";

    reverse(s);
    return 0;
}
最後に編集したユーザー box on 2015年10月15日(木) 23:28 [ 編集 1 回目 ]
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

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

Re: 関数の問題について

#3

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

  • printfで文字列(null-terminated string)を(一発で)出力するには、%cではなく%sを使わなければいけません。
  • reverse関数について、
    • maxは50で決め打ちするのではなく、きちんと入力の長さを測って決めるべきです。
    • i > 0という条件だと、最後(反転する前の文字列では最初)の文字が欠けてしまいます。
    • sは1文字ずつ更新しないといけません。

コード:

void reverse(char x[], char y[])	//xが逆向きに入れる箱での中身でyがlongestの中身
{
	int i,s,max;
	max = 0;
	s = 0;
	while(y[max] != '\0')
		max++;
	x[max] = '\0';

	for(i= max - 1; i >= 0 ; --i)
		x[s] = y[i],
		++s;
	}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

masechin
記事: 7
登録日時: 9年前

Re: 関数の問題について

#4

投稿記事 by masechin » 9年前

ありがとうございます。おかげさまでプログラムを作成することができました。
for(i = max-1~)のところでなぜ-1するのだろうと思いましたが、
'\0'が最初に来てしまうのを防ぐために-1をしていることが分かりました。

かずま

Re: 関数の問題について

#5

投稿記事 by かずま » 9年前

masechin さんが書きました:ありがとうございます。おかげさまでプログラムを作成することができました。
プログラムを作成することができたのなら、それをここに提示してから解決にしてください。
あなたの元のプログラムの reaverse() を、みけCATさんの reverse() に置き換えても、
出力が想定通りにはならないと思います。
また、課題は引数が一つの reverse(s) を書けといっているのに、引数が二つの
reverse(x, y) を書いてしまったことも気になります。
元ネタは、Kernighan & Ritchie の The C Programming Language の Exercise 1-19 ですよね。

閉鎖

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