• 締切済み

C言語のポインタと文字列についての質問です。

jjk65536の回答

  • jjk65536
  • ベストアンサー率59% (66/111)
回答No.7

Cを勉強中ということで、別の書き方も提示しておきます。 char *c; c = "ABC"; c[0] = 'a'; 3行目はリテラルの上書きになるため、C言語では許されていません。 No.5の方のはmallocで確保しても発生する問題なので、 別件と考えたほうが良いと思います。 上記をしたい場合は char c[] = "ABC"; c[0] = 'a'; のように書きます(一例です)。 これは、リテラルではなく文字列配列の先頭を書き換える行為なので 問題がありません。

関連するQ&A

  • C言語のポインタのことで

    int num=15; int *p=# char h= 'A'; char *p=&h; って、数字や一文字の時は変数を用意しなくてはならないのに、 char *z="K"; ←ダブルクォーテーションで囲むと1文字もOK printf("%c\n",*z); とか、 char *name="名前"; printf("%s\n",*name); とかの場合、変数を用意しなくてもできますよね。 文字はどこか別の場所に保管されているのでしょうか?

  • 文字列での代入 (C言語)

    こんにちは。 C言語を勉強しているのですが、どうしても分からないことがあるので質問しました。 まず下記のソースを見てください。 #include <stdio.h> int main() { char* moji; moji = "right Test \n"; printf(" moji = %s\n", moji); moji = "dot 255 left up down \n"; printf(" moji = %s\n", moji); getchar(); return 0; } char* mojiがメモリを取らずに代入できているのですがこういった事が可能なのは何故でしょうか? その後もmojiの変数を別の文字列定数で書き換えています。 こういったことはできなかったはずなんですがどうしてでしょうか? 自分の開発環境だとVS.2005 VC++です。 よろしくおねがいします。

  • C言語で、入力された、文字列を逆に並べるプログラム。

    タイトルのとおりのプログラムをつくりたいんです。 例えば、abcと入力したら、cbaと返してくれるものです。 条件として、ポインタを使えと言われています。 自分で書いたソースは、 0: #include<stdio.h> 1: char re(char *s); 2: main() 3: { 4: char s[10]; 5: gets(s); 6: re(s); 7: printf("%s\n",s); 8: } 9: 10: char re(char *s){ 11: char c[10]; 12: 13: c[9]=s[0]; 14: c[8]=s[1]; 15: c[7]=s[2]; 16: c[6]=s[3]; 17: c[5]=s[4]; 18: c[4]=s[5]; 19: c[3]=s[6]; 20: c[2]=s[7]; 21: c[1]=s[8]; 22: c[0]=s[9]; 23: 24: return c[10]; } C言語を勉強し始めたばかりで、なかなか思うようにかけないでいます。 文字列を入力するのは、4行目~7行目で大丈夫だと思うんですよ。 文字列を逆に並べる、関数 re(char *s)を作れずにいます。 配列s[10]に入っている、文字を最後から取り出して、c[10]にいれていけば、ひっくり返ると思っているんですが、作れません。 13行~21行目の作業も、whileかforでループさせるべきなのもわかってるんですが、条件をどうしたらいいか分からずに作れずにいます。今のソースのまま実行しても、入力したまま出力してしまいます。 さらに、ポインタも今日はじめて勉強して、うっすらと知ってるくらいなので、アドレスとかが、イメージできないでいます。 ながくなってすいません。アドバイスいただきたいです。よろしくおねがいします。

  • ポインタの文字列

    例えば char buf[] = "てすと"; printf("%s", buf[2]); は問題ないですが、 char *buf = "テスト"; printf("%s", buf[2]); は間違った使い方ですか?

  • c言語の文字列出力

    プログラミング超初心者です サイトで文字列の出力について調べていたところ c言語は変数に文字列を代入することができないのでstrcpy関数を使い以下のようにするとあります char s[5]; strcpy(s, "ABCDE"); printf("%s\n", s); ところが他のサイトでは以下のように説明しています char s[5] = "ABCDE"; printf("%s\n", s); 明らかに後者の方が簡単で良いように見えるのですが違いはなんですか? あと、文字列の配列の指定?の[5]の部分なのですが 数字を記載しているところがほとんどですが省略しているところも有ります どんな文字列が入るかわからない場合もありますがここは省略しない方が良いのですか? よろしくお願いします

  • C言語 ポインターと文字列

    C言語の勉強をしており、その途中でよく分からない挙動に出くわしたので 原因を知りたく、投稿しました。 よく分からない挙動と言うのは ポインターで作った文字列表示の際に for(i=0; *(str+i) != '\0'; i++) としてfor文を抜ける様にしたのですが、最後まで表示した後に セグメントエラーになってしまいます。 真ん中の文がおかしいのかと思い、単体で printf("%c", *(str+1)) や printf("%c", *(str+i)) (iには適当な数字を入れて) 表示したのですがセグメントエラーにはなりませんでした。 また、下の様に手書きの場合とfor文で回した場合でプログラムを作って試したのですが、 手書きの方はエラーは出ず、for文だとエラーがでました。 これはfor文の仕様なのでしょうか? 分かる方がいらっしゃったら教えて頂けるとありがたいです。 ちなみにパソコンは MacOSX10.6 コンパイラはXcodeを落とした時に入手できるもの i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3) Copyright (C) 2007 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. を使用しました。 int i; char *name; name = "test"; printf("name: %s\nadd: %p\n", name, &name); printf("by hand\n"); printf("%c\n%p\n",*(name+0), (name+0)); printf("%c\n%p\n",*(name+1), (name+1)); printf("%c\n%p\n",*(name+2), (name+2)); printf("%c\n%p\n",*(name+3), (name+3)); printf("%c\n%p\n",*(name+4), (name+4)); printf("with for\n"); for (i = 0; i < 4; i++) { printf("%c\n%p\n",*(name+i), (name+i)); }

  • c言語のポインタへの文字列入力についてです。

    当方c言語初学者なのですがscanfを使ってポインタに文字列を入力したいのですがバグが発生して進みません・・・どういうことなのでしょうか? #include <stdio.h> int main(void) { char *a; scanf("%s", a); printf("%s", a); return (0); } *aをa[128]; のように配列に変えるとうまくいくことはなんとかわかるのですが・・・助けてください(^_^;)

  • ポインタで分からないことがあります。

    つい最近C言語の勉強を始め、現在ポインタの勉強をしています。 過去の質問を検索したり、サイトを見てみましたが、一人の力では解決できませんでしたので質問させていただきます。 ポインタのプログラムで、下記のプログラムについて分からないことがありました。 ――――――――――――――――――――――――――――――――― #include <stdio.h> int main (void) { char *str = "abc"; printf ("%s %d %d\n", str, &str, &(*str)); str = "日本語"; printf ("%s %d %d\n", str, &str, &(*str)); return 0; } ――――――――――――――――――――――――――――――――― このプログラムで、「char *str = "abc";」の部分でstrには abcのアドレスが入っていると思っていたのですが、 1度目の「printf ("%s %d %d\n", str, &str, &(*str));」で、 結果が「abc 1245064 4235560」となっているのを見ると 私の見解は間違っている気がします。 「char *str = "abc";」の部分では一体なにが行われているのでしょうか? また、このプログラムをコンパイルして実行した結果が、 abc 1245064 4235560 日本語 1245064 4235574 となったのですが、なぜstrのアドレスは同じなのに、 &(*str)のアドレスは異なるのでしょうか? 質問をまとめますと、以下の2つです。 1.「char *str = "abc";」の部分では一体なにが行われているのでしょうか? 2.「abc」と「日本語」のstrのアドレスは同じなのに、&(*str)のアドレスは異なるのでしょうか? 初心者ですので言葉の足らない部分があるかもしれませんが、ご教授のほどよろしくおねがいします。

  • C言語 文字列操作

    トリム関数とリムーブ関数を作成してみました。改良点はありますでしょうか? ~~~~以下ソース~~~~ #include <stdio.h> #include <stdlib.h> #include <string.h> char *Trim(char *str); char *Remove(char *str, char *rmv); void main(void) {  char str[10], rmv[10], *p;  int c;  /* " abcd "をトリムする */  strcpy(str, " abcd ");  printf("トリム前 |%s|\n", str);  p = Trim(str);  printf("トリム後 |%s|\n", str);  /* 指定文字列を削除する */  printf("削除する文字列を入力してください :");  scanf("%s", rmv);  Remove(str, rmv);  printf("削除後 |%s|\n", str);  exit(0); } char *Trim(char *str) {  char space[] = " ";  char null[] = "";  int index = 0;  while(1){   if(strcmp(&(str[index]), null) == 0){    index--;    if(strncmp(&(str[index]), space, 1) == 0){     strcpy(&(str[index]), &(str[index]) + 1);    }else{     break;    }   }else{    if(strncmp(&(str[index]), space, 1) == 0 && index == 0){     strcpy(&(str[index]), &(str[index]) + 1);    }else{     index++;    }   }  }  return str; } char *Remove(char *str, char *rmv) {  int c, size, i;  char *p;  c = '\0';  p = strchr(rmv, c);  size = p - rmv;  for(i = 0; i < size; i++){   c = (int)rmv[i];   p = strchr(str, c);   if (p != NULL) {    strcpy(&(str[p-str]), p + 1);   }   else{    printf("""%c""は見つかりませんでした\n", c);   }  }  return str; }

  • Cでは文字列をどのように認識するのでしょうか?

    C言語には文字列型というものは存在しないと教わりました。 文字列の終わりはヌル文字で認識できますが、 文字列型というものが存在しないのに何故次のバイトを読もうとするのですか? たとえばchar str[] = "abc";、あるいはchar *p = "abc";とあったとして printf(str);あるいはprintf(p); でなぜabcが出力されるのでしょうか?なぜaの次にbがbの次にcがあるとわかるのでしょうか? char型で先頭アドレスが渡された場合、ヌル文字を見つけるまでアドレスをインクリメントし続けるという決まりでもあるのでしょうか? それに文字列型というものが存在しないなら''と""を分ける意味もないのでは??