• ベストアンサー

文字列の最後がNULL ?

例えば char str[] = "mojiretu" と言うのがあって、文字列の終端を判定するのに (str+8)がNULLではなく*(str+8)がNULLであることを判定します。 これってなぜですか?よろしくお願いします。

noname#142813
noname#142813

質問者が選んだベストアンサー

  • ベストアンサー
  • buriburi3
  • ベストアンサー率44% (353/792)
回答No.4

ヌルポインタとヌル文字の違い。 処理系によっては'\0'がNULLで定義されていて、どちらも「ヌル」と表現するので紛らわしい。 文字列の終端はヌル文字 str[]には実際には 'm','o','j','i','r','e','t','u','\0' の9文字が格納される。

その他の回答 (3)

  • ultraCS
  • ベストアンサー率44% (3956/8947)
回答No.3

もしかして、ポインタの使い方がわかっていないのです (str+8)はstrのアドレスに8キャラクタを加えた場所のアドレスで、*(str+8)はそのアドレスに格納されている内容です。 内容に関しては、ASCIIZ文字列で検索してみてください。 なお、文字列をどのように保持するかについては、処理系によって違う場合もあるし、今は多分無いと思いますが、GCOSやTOSBAC、ACOS6のBCDコードやUNIVACのFDコードで記述された場合、0x00は定義文字と重複する場合があるので、使えないで他の方法が使われる場合もあります。 余談ですが、EBCDICでCをコーディングする場合、中括弧{}が無いので、@(と@)で代用します。というように、こういう話は、処理系とコード系まで考えないと間違ってしまうこともあります。

回答No.2

#1さんも仰っている通り、文字列の終端は'\0'であって、NULLではありません。 メモリー上の値を見るとchar型の0が入っているようにしか見えないため、(void*)0であるNULLと同じ値のように見えてしまうかもしれませんが、両者は型もその概念も別のものです。 あと、NULL というのは (void*)0ですから、str+8==NULLなら、str==-8になってしまいます。 文字列の終端が'\0'な理由は、そう決めたからでしょうね。 有限な配列を示すには長さをどこかで教える方法か終端記号を決めておく方法かのどちらかしかとれませんが、C言語の文字列では後者の方法を使っていて、'\0'を終端記号として使っています。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

>(str+8)がNULLではなく*(str+8)がNULLであることを判定します。 文字列の終端はNULLではなくて'\0'です。 *(str+8)、つまりstr[8]が'\0'であることをもって、 文字列の終端を判定します。

関連するQ&A

  • 文字列がNULLか空文字列かの判定

    Visual C++で、Cのプログラムを作成しているものです。(OS:WinNT 4.0) 文字列の扱いについて、質問します。 関数 int func(char *str) があると仮定します。 パラメータとして、strは以下のような状態あるとします。 (strは関数が呼ばれる前にcalloc()で領域確保済み)  シンボル名 値  str      0x00000001 "" 上記の状態で、strがNULLか空文字列("")であることを条件式にしたいのですが、str == NULL は偽となり、strcmp(str, "") を使用すると異常終了します。 どうしたらよいのでしょうか。アドバイスをお願いします。

  • 空の文字列とnullと""

    java初心者です。 空の文字列とnullと""の3つの関係がよくわかりません。 TextFieldを使った簡単なプログラムを作りました。そこで、”TextFieldに何も入力されていないこと”を判定する文を書こうと思ったのですが、どう書けばいいのか迷いました。 TextFieldのオブジェクトをtfとして、tf.getText()==""かtf.getText()==nullで大丈夫だと思いましたが、実行してみると、どちらを用いても判定できませんでした。結局、tf.getText().length()==0で判定できました。そこで、リファレンスを見ると、getText()はデフォルトで空の文字列を返すと、書いてありました。 したがって、「""とnullは空の文字列とは異なる」という理解に至ったのですが、では空の文字列とは何なのかという疑問がわいてきました。 また、自分は""とnullの違いもよくわかっていません。""とnullが異なるものである、ということはわかるのですが・・・ 質問をまとめると ・空の文字列とは何なのか? ・空の文字列は""やnullとどう違うのか? です。よろしくお願いします。

    • ベストアンサー
    • Java
  • Cでは文字列をどのように認識するのでしょうか?

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

  • nullを文字列にするには?

    nullなどリテラルを文字列にする方法が知りたいです。 何でも.toString()で文字列になるのかと思っていましたが、nullはダメでした。

  • 文字列の検索

    プログラミングの勉強の際に下のプログラムを作りました。 最初にある文字列を入力して、その後別の文字列を入力して、 後に入力した文字列が最初に入力した文字列に含まれていれば1、 含まれていなければ0と表示するプログラムです。 コンパイルは通るのですが、文字列を2つ入力すると 「セグメンテーション違反です」と表記されます… どこが悪いのでしょうか? どなたか解説・指摘・模範解答などおねがいします。 (使用するのは#include<stdio.h>のみ、ポインタ変数必須です) #include<stdio.h> char *mystrfin(char *a, char *b); int main(void) { char str1[100],str2[100]; printf("1>>"); fgets(str1,100,stdin); printf("2>>"); fgets(str2,100,stdin); *mystrfin(c,d); } char *mystrfin(char *a,char *b){ char *c,*d; while(*c!='\0'){ c=a; d=b; while(*c!='\0' && *d!='\0') if(*c!=*d) printf("0"); break; c++; d++; } if(*d='\0') printf("1"); a++; return a; return NULL; }

  • 文字列の検索

    先日同じ質問をして、プログラムの内容を修正したのですが、今度は2つ文字列を入力した後0が無限にでてきます… どなたか解説・指摘・模範解答などおねがいします。 内容は最初にある文字列を入力して、その後別の文字列を入力して、 後に入力した文字列が最初に入力した文字列に含まれていれば1、 含まれていなければ0と表示するプログラムです。 (使用するのは#include<stdio.h>のみ、ポインタ変数必須です) #include<stdio.h> char *mystrfin(char *a, char *b); int main(void) { char *c,*d; char str1[100],str2[100]; printf("1>>"); fgets(str1,100,stdin); printf("2>>"); fgets(str2,100,stdin); *mystrfin(c,d); } char *mystrfin(char *a,char *b){ char *c,*d; while(c!='\0'){ c=a; d=b; while(c!='\0' && d!='\0'){ if(c!=d) printf("0"); break; c++; d++; } } if(d='\0') printf("1"); a++; return a; return NULL; } 例 検索対象文字列:asdfghjkl 検索文字列:sdf 1と出力 検索対象文字列:asdfghjkl 検索文字列:qwer 0と出力

  • 文字列をうまく返してくれない

    数値を文字列として呼び出し元に渡し、呼び出し元で文字列を数値に変えようとしたのですがatoi関数(strtolを使うと最初の文字のみ帰ってくるため2桁以上の数値に対応できない)を使うとうまく行きませんでした。 どのように変更したらatoiが使える文字列になりますか? #include <stdio.h> #include <stdlib.h> static struct{   char *name; }kuda[5]={   { "もも" , "りんご" , "みかん" , "バナナ" , "パイナップル" } } char *re_3( void ){   int a = 3;   char str_h[100];   char *str;   sprintf_s( str_h , 100 , "%d" , a );   *str = *str_h; //原因はおそらくここ   return str; } void main( void ){   printf( "%s" , kuda[ atoi( re_3() ) ].name ); }

  • 文字列の中から必要なデータを抜き出す

    VC++6.0 です。 計測機器から受信したデータ(文字列)の中から、必要なデータだけを抜き出したいのですが、 うまく抜き出すことが出来ません。アドバイスいただけませんでしょうか? 受信する文字列は 伝送制御キャラクタSTX(0x02) "文字列" 伝送制御キャラクタETX(0x03) のように受信します。 抜き出すための目印?がキーボードで入力できるような文字列の場合は過去ログにありました以下のコードで 抜き出すことが可能でした。 抜き出すための目印を 0x02 や 0x03 にする為にはどうしたら良いでしょうか?   //文字列版 #include <stdio.h> #include <string.h> #include <stdlib.h> char *cut(const char *str, const char *ss, const char *es, char *buff){ /* str の ss の次から es の前までの文字列をbuff に切り出す */ char *wk, *s, *e, *c; wk=strdup(str); if(wk==NULL)return NULL; s=strstr(wk, ss); if(s==NULL){ free(wk); return NULL;} c=s+strlen(ss); e=strstr(c, es); if(e==NULL){ free(wk); return NULL; } *e='\0'; strcpy(buff, c); free(wk); return buff; } int main(void){ const char url[]="?http://www.sample.ne.jp/";? char buff[32]; printf("//~/:%s\n", cut(url , "//", "/", buff)); return 0; }

  • 文字列strの中から文字cを探すプログラム(C言語)がわからない

    文字列strの中から文字cを探すプログラム(C言語)がわからない 柴田望洋さんの「[新版]明解C言語」という本の演習11-2なんですがどうしてもわかりません。間違いは無いと思うのにコンパイルすると警告を吐かれます。 僕が書いたプログラムを載せます。 /* 文字列strの中に、文字cが含まれていれば(複数ある場合は、最も先頭側とする)、 その文字へのポインタを返し、含まれていなければNULLを返す関数 char *str_chr(const char *str, int c) {} を作成せよ。 */ #include<stdio.h> char *str_chr(const char *str, int c){ while(*str){ if(*str==c) return str; str++; }     return NULL; } int main(){ char *str; char c; scanf("%s",str); scanf(" %c",c);     printf("%d",str_chr(str,c)); return 0; } コンパイラは「関数str_chrのif分の中のreturn strの型変換に問題がある」と言っているんです。 型変換はしるつもりは無いのにコンパイラはなぜそのように認識するのでしょうか。 またネット答えを探しましたがどうやらこのreturn strの部分はreturn (char*)strが正解のようです。意味がわかりません。strはポインタなのになぜまたわざわざchar型に変換しているのですか?といか(char*)の意味が根本的にわかりません。 質問ばかりですみません。初心者でポインタがどうにも理解できないんです。 誰か詳しい人教えてください。 お願いします。

  • (String)nullはnullではなく文字列?

    引数として、(String)nullを渡しているコードがあるのですが、 これは「null」ではなく文字列としての「null」を渡しているのでしょうか? ・Stringでキャストしていると思うのですが、nullもキャストできるのでしょうか? ・それとも何か特別な意味がある?

    • ベストアンサー
    • Java