2017-10-01 4 views
-3

は、私はあなたが関数にローカル変数のアドレスを渡すされている場合があります小文字 - 私は実行可能ファイルを実行したい場合にセグメンテーションフォールト

void lowerupper(char *s){ 
    int i ; 

    int a = strlen (s); 

    printf("%d\n", a); 

    //fails here segmentation fault 

    for (i=0 ; i < a-1 ; i++){ 

     if((s[i] >= 97) && (s[i] <= 122)){ 
      s[i] = s[i] - 32; 
     } 
    } 
} 

int main(void) { 

    char* string1 = 'HeLlo wOrlD'; 

    printf("%s\n", string1); 

    lowerupper(string1); 

    printf("%s\n", string1); 

    return 0; 
} 
+0

はいです。私はそれを訂正するために何ができるのですか? : –

+0

ループの 'for(i = 0; i

答えて

0

セグメンテーションフォールトエラーを持っています。 ヒープにメモリを割り当て、その変数を関数に渡す必要があります。 このコードはここで働く:

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

void lowerupper(char *s) 
{ 
    int i ; 
    int a = strlen (s); 
    printf("%d\n", a); 

    for (i=0 ; i < a-1 ; i++) 
    { 
     if((s[i] >= 97) && (s[i] <= 122)) 
     { 
      s[i] = s[i] - 32; 
     } 
    } 
} 

int main(void) 
{ 
    char *ss=malloc(10); 
    strcpy(ss,"hello\n"); 
    lowerupper(ss); 
    printf("%s",ss); 
    return 0; 
} 

サンプル出力:あなたはstring1を変更することはできません

ハロー

+0

不要です。 – Olaf

+0

@Olafええ、可能かもしれない – krpra

+0

@krpra非常に悪い答え - トータルオーバーキル。私は移植性が狂っているわけではありませんが、あなたのソリューションはほとんど読めません。 mallocを使用する場合は、結果を確認してください。あなたのコードに適切にインデントされた質問に答えてください** **私はそれを代わりにしました**) –

1

。実際には、あなたは、文字列がREAD-ONLYメモリ領域に格納することができ、この

char* string1 = "HeLlo wOrlD"; 

のような文字列は、それはあなたがそれを読んで、それを修正することができないことを意味宣言するとき。あなたは

char array[] = "hello world"; 

を行う場合 が、それは読み取り専用の文字列を作成し、arrayにコピーした文字を、あなたは(arrayに)それを変更できるようになります。 キーワードconstを使用して読み取り専用文字列を宣言するように招待されています。

const char *string1 = "HeLlo wOrlD"; 
+0

ポインタは文字列ではなく、配列単位でもありません。 Cには文字列型はありません。 – Olaf

+0

@Olafはい、私は少し不器用だった、それについて話すための正しい言葉を見つけることは必ずしも容易ではありません:( – Gam

関連する問題