2009-03-04 6 views
2

だから、私はchar * stuffを小文字にするプログラムを持っています。これは、アスキーを繰り返し処理することでそれを行います。今、私はおそらくC++でこれについてのライブラリがあると知っていますが、それはポイントではありません - 私はchar *やstuffについて把握しようとする学生です:)ここで "デバッガは、信号* 10のために終了しました。char * iterationを書くとき

は私のコードです:

#include <iostream> 

using namespace std; 

char* tolower(char* src); 

int main (int argc, char * const argv[]) 
{ 
    char* hello = "Hello, World!\n"; 

    cout << tolower(hello); 
    return 0; 
} 

char* tolower(char* src) 
{ 
    int ascii; 
    for (int n = 0; n <= strlen(src); n++) 
    { 
     ascii = int(src[n]); 
     if (ascii >= 65 && ascii <= 90) 
     { 
      src[n] = char(ascii+32); 
     } 
    } 

    return src; 
} 

(これは割り当てのためではありません;))

それは罰金のビルドが、私はそれを、それを実行するとき、私は「デバッガは信号のため終了しました取得10 "とXcodeは私に行を指します:" src [n] = char(ascii + 32); "

ありがとうございます!

マーク

+0

nの値は? –

+0

また、intに変換して戻ってくる思考プロセスは何ですか?前回チェックしたとき、charは既にC++の数値型でした。 –

+0

http://stackoverflow.com/questions/257391/c-error-with-pointer-and-const-char –

答えて

9

Yowsers!

"Hello World!" stringは文字列リテラルと呼ばれるもので、メモリはプログラムの一部であり、書き込むことはできません。

「インプレース」変換と呼ばれる処理を実行しています。小文字のバージョンを新しいバッファに書き出すのではなく、元の宛先に書き込んでいます。宛先はリテラルなので書き込むことができないため、クラッシュする可能性があります。

これを試してください。あなたのforループでも

char hello[32]; 
strcpy(hello, "Hello, World!\n"); 

、あなたは<、ない< =を使用する必要があります。 strlenは、文字列の長さからヌル終端文字を引いた長さを返します。配列インデックスは0から始まります。

+0

良い答えですが、完全性のためにはstrlcpy()が望ましいです。 –

+0

どうすればchar hello [] = "Hello World \ n" –

+0

クイックコメントですが、完全な "Hello、World!\ n "は定数で、長さをチェックする必要はありません。 –

7

As Andrewはコード内で"Hello World\n"が読み取り専用のリテラルであると述べています。あなたは、変更可能なコピーを作成するstrcpyを使用するか、あるいはこれを試すことができ、次のいずれか

char hello[] = "Hello, World!\n"; 

これは自動的に文字列リテラルと末尾の'\0'のコピーを保持するのに十分な大きスタック上の配列を割り当て、コピーリテラル配列に挿入します。

また、あなただけのcharとしてアスキーを残し、そして'A'の数値が何であるかを知ることで文字リテラルを代わりに使用することができます。

char ascii; 
for (int n = 0; n < strlen(src); n++) 
{ 
    ascii = src[n]; 
    if (ascii >= 'A' && ascii <= 'Z') 
    { 
     src[n] = ascii - 'A' + 'a'; 
    } 
} 

あなたはそれに取り組んでいる一方で、なぜアスキーでわざわざただ

for (int n = 0; n < strlen(src); n++) 
{ 
    if (src[n] >= 'A' && src[n] <= 'Z') 
    { 
     src[n] -= 'A' - 'a'; 
    } 
} 

そして、あなたは、c-文字列の長さを決定するために、あなたはとにかくそれにもかかわらず反復処理する必要があるという事実を利用することができ、そして:すべてで、ちょうどSRC [n]を使用します両方を組み合わせる:

for (char *n = src; *n != 0; n++) 
    if (*n >= 'A' && *n <= 'Z') 
     *n -= 'A' - 'a'; 
関連する問題