【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.22546

ポインタの演算について
投稿者---まんまる(2005/08/10 15:30:40)


こんにちは、お世話になります。
現在ポインタを使って入力された文字列のソートというのをやっているのですが、
下記のコードを作成したのですがコンパイルエラーが出てしまいます・・・。

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

void sort(char *strin,int len);

void main(void)
{
 char c[]="dcba";
 len = strlen(c);

 sort(c,len);
 printf("%s\n",c);
}

//ソート
void sort(char *strin,int len)
{
 int i;
 char temp;

 while( *strin != '\0'){
  for ( i = 1; i < len; i++ ){
   if ( *strin > (*strin) + i){
    temp = *strin;
    *strin = (*strin) + i;
    (*strin) + i = temp;
   }
  }
  *strin++;
 }
}
ーーーーーーーーーーーーーーーーーーーーーーーーーー
よろしくお願いしますm(_ _)m


>私信 Blue様
前回の質問にわざわざコードまで載せていただいてありがとうございました。
まだポインタなどはよくわかっていなかったのですが、ポインタを使用せずに
自作関数を作成することはできました。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ポインタの演算について 22547 とおり 2005/08/10 15:35:50
<子記事> Re:ポインタの演算について 22549 επιστημη 2005/08/10 15:43:28
<子記事> Re:ポインタの演算について 22553 まんまる 2005/08/10 15:51:52
<子記事> Re:ポインタの演算について 22554 Blue 2005/08/10 15:52:30
<子記事> Re:ポインタの演算について 22555 まきじ 2005/08/10 15:53:59
<子記事> Re:ポインタの演算について 22557 円零 2005/08/10 16:11:06
<子記事> Re:ポインタの演算について 22560 まんまる 2005/08/10 16:38:08


No.22547

Re:ポインタの演算について
投稿者---とおり(2005/08/10 15:35:50)


最大のヒントであるコンパイルエラーの内容を書かないのはなぜかと…
回答者にいちいちコンパイルして試せ、と言っているのか。


この投稿にコメントする

削除パスワード

No.22549

Re:ポインタの演算について
投稿者---επιστημη(2005/08/10 15:43:28)


>下記のコードを作成したのですがコンパイルエラーが出てしまいます・・・。

どこでどんなエラーがでたか くらいは書くのがマナーじゃないかい?



この投稿にコメントする

削除パスワード

No.22553

Re:ポインタの演算について
投稿者---まんまる(2005/08/10 15:51:52)


>#include <string.h>
>#include <stdio.h>
>
>void sort(char *strin,int len);
>
>void main(void)
>{
> char c[]="dcba";
> len = strlen(c);
>
> sort(c,len);
> printf("%s\n",c);
>}
>
>//ソート
>void sort(char *strin,int len)
>{
> int i;
> char temp;
>
> while( *strin != '\0'){
>  for ( i = 1; i < len; i++ ){
>   if ( *strin > (*strin) + i){
>    temp = *strin;
>    *strin = (*strin) + i;
>    (*strin) + i = temp;
>   }
>  }
>  *strin++;
> }
>}
>ーーーーーーーーーーーーーーーーーーーーーーーーーー

すみませんでした。以下エラー文です。

[satou@test ~/8.10]$ gcc -o 1.exe 1.c
1.c: In function `sort':
1.c:26: invalid lvalue in assignment
[satou@test ~/8.10]$


この投稿にコメントする

削除パスワード

No.22559

Re:ポインタの演算について
投稿者---まきじ(2005/08/10 16:29:20)


>1.c:26: invalid lvalue in assignment

(*strin) + i は、オブジェクト型を持たないので、左辺値になれない。

22555 の
>for ( i = 1; i < len; i++ ){ // 0 文字目がソートされない
は間違いでした。


この投稿にコメントする

削除パスワード

No.22554

Re:ポインタの演算について
投稿者---Blue(2005/08/10 15:52:30)


ざっと見たところ
> if ( *strin > (*strin) + i){
がおかしいそうですね。
strin  は char* 型
*strin は char  型です。

よって
(*strin) + i は char型の値に+iしています。

それと、ソースを載せるときはHTML昆布をご利用ください。
(<pre></pre>で囲うだけでもいいけど)



この投稿にコメントする

削除パスワード

No.22555

Re:ポインタの演算について
投稿者---まきじ(2005/08/10 15:53:59)


while( *strin != '\0'){
    for ( i = 1; i < len; i++ ){  // 0 文字目がソートされない
                                // strin をインクリメントしてるので、配列の要素数を超えて参照する事になる。
        if ( *strin > (*strin) + i){  //(*strin) + i は、strin が指してる値に + i する事になる。
            temp = *strin;
            *strin = (*strin) + i;
            (*strin) + i = temp;
        }
    }
    *strin++; //大きいものを右端にしてるのに、左端からソートの範囲を縮めてる。
             // * は不要。
}



この投稿にコメントする

削除パスワード

No.22557

Re:ポインタの演算について
投稿者---円零(2005/08/10 16:11:06)


なんか面倒になってきたのでそのまんま回答しちゃえ。

訂正箇所
・lenの宣言に型
・*strin + i を strin[i] に書き換え
・for文の継続条件
・sortを抜け出すときにstrinを元の位置に戻す

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

void sort(char *strin, int len);

void main(void)
{
    char c[]="dcba";
    int len = strlen(c);

    sort(c,len);
    printf("%s\n",c);
}

void sort(char *strin,int len)
{
    int i;
    char temp, *strcpy = strin;

    while( *strin != '\0'){
        for( i = 1; strin[i] != 0; i++ ){
            if( *strin > strin[i] ){
                temp = *strin;
                *strin = strin[i];
                strin[i] = temp;
            }
        }
        strin++;
    }
    strin = strcpy;
}



この投稿にコメントする

削除パスワード

No.22558

Re:ポインタの演算について
投稿者---円零(2005/08/10 16:17:25)


書き忘れ。
・*strin++ の * をはずす
・全角スペースを半角に


この投稿にコメントする

削除パスワード

No.22561

Re:ポインタの演算について
投稿者---円零(2005/08/10 16:39:11)


何を勘違いしてたんだろう。

・sortを抜け出すときにstrinを元の位置に戻す

これ全く必要ないですね。


この投稿にコメントする

削除パスワード

No.22560

Re:ポインタの演算について
投稿者---まんまる(2005/08/10 16:38:08)


みなさまどうもありがとうございました。文字列はきちんとソートされました。
ですが、まだきちんとご解答いただいたところの意味を理解していないので
理解できるようにがんばってみます。
ありがとうございました^^


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧