C言語関係掲示板

過去ログ

No.565.空白のある文字列の語の1語1語を逆にするプログラム

[戻る] [ホームページ]
No.5144

教えてください、お願いします。
投稿者---初心者(2003/02/13 03:45:15)


"Hallo!!How are you?"
などの様に途中に空白のある文字列の1語1語を逆("he"なら"eh")にする処理を行って画面に表示するプログラムを作成しなさい。但し、語を逆にする処理は、以下に示す関数word_reverse()を作って、そこで行う形にせよ。
(元の文字列は大きさ100の文字配列に格納して使うものとする。)

1・プロトタイプ宣言
int word_reverse(char *, char *);
2・処理
第1引数で与えられた文字列をスペース(0x20)で区切られた「語」の集合と解釈し、1語1語を逆にする処理を施した後、出来た文字列を第2引数で与えられたアドレスで指定される領域に書きこむ。但し、第1引数で与えられた文字列はNull-terminateされているものと仮定して処理を行う。
3・引数
第1引数 - 元文字列が格納されているメモリ領域のトップアドレス
第2引数 - 「語」を逆にする処理を施して出来た文字列を書き戻すべきメモリ領域のトップアドレス
4・戻り値
処理結果リターンコード
正常終了時 - 逆にした「語」の個数(0,1,2,3,4,5・・・)
異常終了時 - (−1):100文字を越えても文字列は終了しなかったので処理を中断


No.5157

すいませんm(_ _)m空白のある文字列の語の1語1語を逆にするプログラムです。
投稿者---初心者(2003/02/14 03:38:56)


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

void main(void)
{
int word_reverse(char *, char *);

char y[100]="I want to fly because if I can fly that feel so freedom";
char o[100];
int i;

i = word_reverse(y, o);

printf("%s\n",o);
}
int word_reverse(char *g, char *b)
{
int p = 0,k,i = 0;
int v = strlen(g);
if(v < 101)
{
for(k = 0; k < v; k++)
{
if(*g == '0x20')
{
</pre>
自分でなんか違うなぁ〜と思いながらも、作ってみたのがこれです。
よろしくお願いします。

No.5159

Re:すいませんm(_ _)m空白のある文字列の語の1語1語を逆にするプログラムです。
投稿者---a(2003/02/14 10:12:40)


size_t reverse(const char* ps1,char* ps2){
        if(strlen(ps1)<100){
                char buf[100];const char*p=ps1,*p2=ps1;int count=0;
                while(p=strchr(p2,' ')){
                        for(int i=0;*p2!=' ';p2++)
                                buf[i++] = *--p;
                        buf[i]=' ';buf[i+1]='\0';strcat(ps2,buf);count++;p2++;
                }
                int i=0;
                while(*++p2!='\0');
                while(*p2!=' ')buf[i++]=*--p2;
                buf[i]='\0';strcat(ps2,buf);count++;
                
                return count;
        }
        return -1;
}
void cxxfunc(){
        char s1[]="24 324 0100 27 90 1428 24";
        char s2[100]="";
        printf("%d:%s\n",reverse(s1,s2),s2);
}


No.5162

Re:すいませんm(_ _)m空白のある文字列の語の1語1語を逆にするプログラムです。
投稿者---JUN2(2003/02/14 10:58:00)


<pre>&lt;pre&gt;#include    &amp;lt;stdio.h&amp;gt;
#include    &amp;lt;stdlib.h&amp;gt;
#include    &amp;lt;string.h&amp;gt;

int    word_reverse(char*, char*);

char data[100]=&amp;quot;I want to fly because if I can fly that feel so freedom&amp;quot;;
char buff[100];

void main(void)
{
    if(!word_reverse(data, buff)){
        printf(&amp;quot;%s&amp;quot;,buff);
    }
    else{
        printf(&amp;quot;エラー&amp;quot;);
    }
}

int    word_reverse(char* pData, char* pBuff)
{
    char*    token;
    int        i,len,cnt;

    if(strlen(data) &amp;gt; 100){
        return(-1);
    }

    cnt = 0;
    pBuff = buff;
    token = strtok( data, &amp;quot; &amp;quot;);
    while(1){
        if(token == NULL){
            break;
        }
        else{
            len = strlen(token);
            for(i=len-1;i&amp;gt;=0;i--){
                *pBuff++ = *(token+i);
            }
            *pBuff++ = 0x20;
        }
        token = strtok( NULL, &amp;quot; &amp;quot;);
    }
    *(--pBuff) = 0;
    return(0);
}
&lt;/pre&gt;</pre>


No.5164

Re:すいませんm(_ _)m空白のある文字列の語の1語1語を逆にするプログラムです。
投稿者---JUN2(2003/02/14 11:11:05)


自分でタブを入れて見てください。

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

int word_reverse(char*, char*);

char data[100]="I want to fly because if I can fly that feel so freedom";
char buff[100];

void main(void)
{
if(!word_reverse(data, buff)){
printf("%s",buff);
}
else{
printf("エラー");
}
}

int word_reverse(char* pData, char* pBuff)
{
char* token;
int i,len,cnt;

if(strlen(data) >= 100){
return(-1);
}

cnt = 0;
pBuff = buff;
token = strtok( data, " ");
while(1){
if(token == NULL){
break;
}
else{
len = strlen(token);
for(i=len-1;i>=0;i--){
*pBuff++ = *(token+i);
}
*pBuff++ = 0x20;
}
token = strtok( NULL, " ");
}
*(--pBuff) = 0;
return(0);
}


No.5165

Re:すいませんm(_ _)m空白のある文字列の語の1語1語を逆にするプログラムです。
投稿者---とおりすがり(2003/02/14 11:16:08)


>自分でタブを入れて見てください。

代理アップ m(__)m

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

int    word_reverse(char*, char*);

char data[100]="I want to fly because if I can fly that feel so freedom";
char buff[100];

void main(void)
{
    if(!word_reverse(data, buff)){
        printf("%s",buff);
    }
    else{
        printf("エラー");
    }
}

int    word_reverse(char* pData, char* pBuff)
{
    char*    token;
    int      i,len,cnt;

    if(strlen(data) >= 100){
        return(-1);
    }

    cnt = 0;
    pBuff = buff;
    token = strtok( data, " ");
    while(1){
        if(token == NULL){
            break;
        }
        else{
            len = strlen(token);
            for(i=len-1;i>=0;i--){
                *pBuff++ = *(token+i);
            }
            *pBuff++ = 0x20;
        }
        token = strtok( NULL, " ");
    }
    *(--pBuff) = 0;
    return(0);
}


No.5170

Re:すいませんm(_ _)m空白のある文字列の語の1語1語を逆にするプログラムです。
投稿者---a(2003/02/14 15:06:31)


> token = strtok( NULL, " ");cnt++
> return(cnt);
cntのカウント抜けてます。
あと俺のは無駄にループが多くて駄目駄目ですね


No.5175

Re:すいませんm(_ _)m空白のある文字列の語の1語1語を逆にするプログラムです。
投稿者---JUN2(2003/02/14 16:31:30)


>> token = strtok( NULL, " ");cnt++
>> return(cnt);
>cntのカウント抜けてます。

あらら、ほんとだ。
修正ありがとうございました。

No.5176

Re:すいませんm(_ _)m空白のある文字列の語の1語1語を逆にするプログラムです。
投稿者---JUN2(2003/02/14 16:40:54)


よく見直してみるといろいろあるなぁ

1.pBuff = buff; は、いらない。
2.dataが空の場合、 *(--pBuff) = 0; はやばい。
strlen(data)<=0 のチェックもいれたほうがいい。

他にもあったら勘弁。



No.5179

Re:すいませんm(_ _)m空白のある文字列の語の1語1語を逆にするプログラムです。
投稿者---初心者(2003/02/15 01:06:00)


>2.dataが空の場合、 *(--pBuff) = 0; はやばい。
> strlen(data)<=0 のチェックもいれたほうがいい。

本当に、皆さんありがとうございますm(__)m
上の2つの意味が良く分からないのですが・・・。
教えてください。



No.5184

Re:すいませんm(_ _)m空白のある文字列の語の1語1語を逆にするプログラムです。
投稿者---かずま(2003/02/15 15:38:31)


自分が C のプログラムを書いているのか、C++ のプログラムを書いているのか
分かっていない人が多いような気がします。
#include <stdio.h>
#include <string.h>

int word_reverse(const char *s, char *t)
{
    int n;   const char *p, *q;

    for (n = 0; ; n++) {
        for (; *s == ' '; s++)
            *t++ = ' ';
        if (*s == '\0') { *t = '\0'; return n; }
        for (p = s; *s && *s != ' '; s++)
            ;
        for (q = s; q > p; )
            *t++ = *--q;
    }
}

int main(void)
{
    char s[] = "I want to fly because if I can fly that feel so freedom";
    char t[100];
    int n = word_reverse(s, t);

    printf("%d\n%s\n", n, t);
    return 0;
}

word_reverse で、t に 100文字以上書き込まないようにするなら、
int word_reverse(const char *s, char *t)
{
    int i, n;   const char *p, *q;

    for (i = n = 0; ; n++) {
        for (; *s == ' '; s++) {
            if (++i >= 100) { *t = '\0'; return -1; }
            *t++ = ' ';
        }
        if (*s == '\0') { *t = '\0'; return n; }
        for (p = s; *s && *s != ' '; s++)
            ;
        for (q = s; q > p; ) {
            if (++i >= 100) { *t = '\0'; return -1; }
            *t++ = *--q;
        }
    }
}


No.5189

Re:すいませんm(_ _)m空白のある文字列の語の1語1語を逆にするプログラムです。
投稿者---a(2003/02/15 16:31:27)


んーーーまさにおれのことですね
いつかcとして出直してきます.

No.5202

Re:すいませんm(_ _)m空白のある文字列の語の1語1語を逆にするプログラムです。
投稿者---初心者(2003/02/16 03:44:41)


皆さん、ありがとうございました。
うまく出来ました。