char *strとchar str[]で定義したときの挙動の違い。
上記の定義は一見違うように見えるが、ある文字列"___str"(アンダーバーはスペース)があり、このスペースを除く関数では挙動が違う。どうして違うのかは目下調査中、以下に正常に動作するコードとしないコードを載せる。下記の本に書いてありそう。
- 作者: 前橋和弥
- 出版社/メーカー: 技術評論社
- 発売日: 2001/01
- メディア: 単行本
- 購入: 22人 クリック: 147回
- この商品を含むブログ (74件) を見る
#include <stdio.h> #include <string.h> int main(void){ char str1[]=" str1"; int i,c=0; //ヌル文字でないかつスペースでない文字を先頭から数える。 for(i=0;((str1[i]!='\0')&&(isspace(str1[i])));i++){ c++; } //スペースでない文字を先頭にずらす。 for(i=c;(str1[i]!='\0');i++){ str1[i-c]=str1[i]; } //文字列の最後にヌル文字を代入する。 str1[i-c]='\0'; fprintf(stdout,"%s\n",str1); return 0; }
segmentation errorが出るコード。
#include <stdio.h> #include <string.h> int main(void){ char *str1=" str1"; int i,c=0; //ヌル文字でないかつスペースでない文字を先頭から数える。 for(i=0;((str1[i]!='\0')&&(isspace(str1[i])));i++){ c++; } //スペースでない文字を先頭にずらす。 for(i=c;(str1[i]!='\0');i++){ str1[i-c]=str1[i]; } //文字列の最後にヌル文字を代入する。 str1[i-c]='\0'; fprintf(stdout,"%s\n",str1); return 0; }