1時間ごとに更新!Amazon.co.jpで今売れている本トップ100   掲示板ランキング



掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

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

掲示板1

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

No.5641

文字列操作についての疑問
投稿者---ニコラス(2006/04/27 10:38:50)


文字列中スペース' 'をコンマ','に変換したいのですが、
以下のコードだとセグメンテーションエラーになって、
動作しません。なにがいけないのかわからなくて、どうか
教えてください!お願いいたします。
---------以下ソースコード----------
#include<stdio.h>

void func1(char *str)
{
    int i;
    for( i = 0; *(str+i) != '\0'; i++ ){
        if( *(str+i) == ' ') *(str+i) = ',';
    }
}

int main()
{
    char *hoge = "BELU RED";
    
    printf("hoge = %s\n", hoge);
    func1(hoge);
    printf("hoge = %s\n", hoge);
    
    return 0;
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:文字列操作についての疑問 5642 Blue 2006/04/27 10:48:24


No.5642

Re:文字列操作についての疑問
投稿者---Blue(2006/04/27 10:48:24)


> char *hoge = "BELU RED";
char hoge[] = "BELU RED";

ではどうなりますか?


この投稿にコメントする

削除パスワード

No.5643

Re:文字列操作についての疑問
投稿者---ニコラス(2006/04/27 11:04:16)


Blueさん、返信ありがとうございます。

できました!数時間悩んだのですが…。
ポインタや配列の考え方について勉強が全然足りないようです。
もっと勉強しよう思います!

本当にありがとうございました!!






この投稿にコメントする

削除パスワード

No.5646

Re:文字列操作についての疑問
投稿者---shu(2006/04/27 14:34:38)


//
//  おまけ
//

//
#include <stdio.h>

//
char *func1( char str[] );
char *func2( char *str );

//
//
int main(void)
{
    char hoge[] = "BELU RED";
    
    //
    puts( hoge );
    puts( func1( hoge ) );
    puts( func2( hoge ) );
    
    return 0;
}
//
char *func1( char str[] )
{
    int i;
    
    for (i = 0; str[i]; i++ ) {
        if (str[i] == ' ') {
            str[i] = ',';
        }
    }
    
    return str;
}
//
char *func2( char *str )
{
    char *p;
    
    for (p = str; *p; p++) {
        if (*p == ',') {
            *p = ' ';
        }
    }
    
    return str;
}



この投稿にコメントする

削除パスワード

No.5647

Re:文字列操作についての疑問
投稿者---kz3(2006/04/27 15:44:28)


>ポインタや配列の考え方について勉強が全然足りないようです。

ポインタも配列も理解されているように思います。
一歩進んで「文字列リテラル」「記憶クラス」を勉強するといいように思います。

文字列リテラルは文字列定数のことですが、
今回ニコラスさんは文字列定数を書き換えたことで問題が起きました。
定数を変更したら数でなくなってしまいますよね?^^

Blueさんが
>> char *hoge = "BELU RED";
>char hoge[] = "BELU RED";
と答えたのは、
前者の"BELU RED"はメモリの静的領域( 書き込み禁止領域 )に配置されるのに対して、
後者の"BELU RED"はスタック領域( 読み書き自由 )に配置されます。
( 詳しくはこちら...記憶クラス )

あと、blueさんが示した[]と、shuさんが示した[]についても混乱しないように説明。

/* 変数の初期化部分です */
char *hoge = "BELU RED";   // 文字列リテラル"BELU RED"へのポインタをhogeに代入
                           // "BELU RED"は静的領域( 書き込み禁止領域 )に配置
char hoge[] = "BELU RED";  // 配列hogeの各要素に'B','L','E','U',' ','R','E','D','\0'を代入( 配列サイズ自動計算 )
                           // スタック領域( 読み書き自由 )に配置
                           // コンパイラが文字列の長さを計算して要素を確保します。
/* 関数のプロトタイプ宣言 */
char *func1( char str[] ); // char型へのポインタ( 下と同等 )
char *func2( char *str );  // char型へのポインタ( 上と同等 )



この投稿にコメントする

削除パスワード

No.5653

Re:文字列操作についての疑問
投稿者---ニコラス(2006/04/28 10:08:03)


shuさん、kz3さん、返信ありがとうございます。

本を読んでもなかなかほしい情報が見つからず困っていました。
おかげで、かなり理解が深まりました。

本当にありがとうございました!!


この投稿にコメントする

削除パスワード

No.5644

Re:文字列操作についての疑問
投稿者---ニコラス(2006/04/27 11:08:15)


まちがえました。BULE(*>_<*)


この投稿にコメントする

削除パスワード

No.5648

Re:文字列操作についての疑問
投稿者---あきき(2006/04/28 03:16:20)


上記のプログラムを、strcmp()関数、strcpy()関数を用いて表現できないか試したところ、どうしても,
*func1()が素通りされます。原因がわからず困っています。
何故かお分かりの方ご教授の程宜しくお願いします。

それともう一点、文字または文字列の比較・代入に
==、= は使えなかったような気がしますが。

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

char *func1(char *str)
{
    int i;
/*  for( i = 0; *(str+i) != '\0'; i++ ){
        if( *(str+i) == ' ') *(str+i) = ',';
    }
*/
    for( i = 0; str[i]; i++ ){
        if( !strcmp(str[i],' ')) strcpy(str[i],',');
    }

    return str;
}

int main(void)
{
//  char *hoge = "BELU RED"; /* 静的領域へ確保*/
    char hoge[] = "BELU RED";// スタック領域へ確保

    printf("hoge = %s\n", hoge);
    func1(hoge);
    printf("hoge = %s\n", hoge);
    
    return 0;
}



この投稿にコメントする

削除パスワード

No.5649

Re:文字列操作についての疑問
投稿者---kz3(2006/04/28 05:31:02)


>それともう一点、文字または文字列の比較・代入に
>==、= は使えなかったような気がしますが。

あききさんが間違っているのでは?
文字と文字列を「または」で一緒にくくることは出来ません。別モノですから。

「文字列の比較」に比較演算子は使えませんね。これは合っています。

「文字列の代入」は何を代入するかにもよりますが

char hoge[] = "BELU RED"; char *hoge = "BELU RED";
どちらも代入しています。 ただし、
char piyo[9]; piyo = "BELU RED";
ということは出来ません。piyoは配列であってポインタ変数ではないですからね。 [要点]代入演算子で配列に文字列を代入するのが出来るのは初期化時だけである。 「文字の比較」に比較演算子は使えます。 「文字の代入」に代入演算子は使えます。
char hoge[] = "BELU RED"; if( hoge[0] == 'B' ) printf("matched !"); else printf("unmatched ...");
何か別の言語と勘違いしているように思われますが... >上記のプログラムを、strcmp()関数、strcpy()関数を用いて表現できないか試したところ、どうしても, >*func1()が素通りされます。原因がわからず困っています。 strcmp()、strcpy()の引数はともにchar型へのポインタであって、char型ではありません。



この投稿にコメントする

削除パスワード

No.5650

Re:文字列操作についての疑問
投稿者---あきき(2006/04/28 05:50:14)


納得しました。有難うございました。


この投稿にコメントする

削除パスワード

No.5651

Re:文字列操作についての疑問
投稿者---Blue(2006/04/28 08:46:21)


無理して、str〜系の関数を使うならば、
>        if( !strcmp(str[i],' ')) strcpy(str[i],',');
        if(!strncmp(&str[i]," ",1)) strncpy(&str[i],",",1);

ですかね。まぁ1文字である場合は、普通に代入したほうがはるかによさそうですけど。


この投稿にコメントする

削除パスワード

No.5652

Re:文字列操作についての疑問
投稿者---nop(2006/04/28 10:03:46)


> char hoge[] = "BELU RED";
> char *hoge = "BELU RED";
> どちらも代入しています。

代入と初期化指定子は別物です。


この投稿にコメントする

削除パスワード

No.5654

Re:文字列操作についての疑問
投稿者---kz3(2006/04/28 11:05:57)


>> char hoge[] = "BELU RED";
>> char *hoge = "BELU RED";
>> どちらも代入しています。

>代入と初期化指定子は別物です。

うっかり初期化を例に代入を説明してしまいました...
nopさん、指摘ありがとうございます。



この投稿にコメントする

削除パスワード

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





掲示板提供:(有)リアル・インテグリティ