• ベストアンサー

Objective-C++はこんな仕様なのでしょうか?

Objective-C++はこんな仕様なのでしょうか? char s1[] = "abcdefg"; char s2[16]; strncpy(s2, s1+2, 2); NSLog(@"s2=[%s]", s2); としたところ、s2は s2=[cd]とならずに s2=[cd何か変な文字・・・] となり、どうも最後にNULLが付加されていません。 memset(s2, 0, sizeof(s2)); // わざわざクリア strncpy(s2, s1+2, 2); の場合は、 s2=[cd]となりました。 Objective-C++はこんな仕様なのでしょうか?

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

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.5

CではNULL=0とは限らないので、それで憶えてしまっているとうっかり変なものを踏む可能性があります。 C++ではNULL=0なのでC++でしか組まないと言うのなら特に気にすることはありませんが、概念的にはNULLとヌル文字は別としておいた方がいいのは事実です。 まぁそれはさておき、ローカル変数は初期化されないというのも、strncpy()がヌル文字を付加しないというのもCの頃から一貫しています。 別にObjective-C++だからそうって訳ではありません。

その他の回答 (5)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.6

「Objective-C++」ってなんだ.... Objective-C と C++ がまざっちゃってるぞ.... さておき, それは「C における『文字列』の仕様」と「strncpy の仕様」の両方による. ちなみに「NULL の値」は考えても無意味. ・「いかなるオブジェクトもささないポインタ値」として「ヌルポインタ値」がある ・ポインタ値が必要な場面で「整定数の 0」が表れたら, それは「ヌルポインタ値」と解釈される と理解してほしい. 「ヌルポインタ値」が実際にどのようなビットパターンとして格納されるかは処理系に聞いてくれ. 以下余談: 非常に細かいところだと '\0' と書いたときに C では int の 0 になるのに対し C++ では char の 0 になるという違いはある... けど, 結局どちらもほとんどの場合で「int の 0」になる. とはいえ, 「0」と「'\0'」ではやっぱり「読んだ人の見方」が違う.

  • YUI_AI
  • ベストアンサー率45% (303/661)
回答No.4

No1です。 NULLと'¥0'の違いは存じておりますが、初心者の方には判り辛いかと思いその様な記述をしておりました。(汗!) ※コードは一緒なので。

mikkychan2
質問者

お礼

話の流れがNULLにそれてますが、 C++では NULL 0と定義されていると思うので、 NULLと '\0'は違うという意味はわかりません。

  • tyatsumi
  • ベストアンサー率58% (30/51)
回答No.3

ちなみに、普通にCの文字列として扱うのであれば、あらかじめ全部を\0で埋めなくても、 文字列の最後に1個だけ\0を入れればよいでしょう。 strncpy(s2, s1+2, 2); s2[2] = '\0';

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

質問者さんも#1さんも大きな勘違いをされているようですね。 NULLは、'\0'のこと「ではありません」。

  • YUI_AI
  • ベストアンサー率45% (303/661)
回答No.1

C言語の標準関数である「strncpy」の仕様がそうなっています 上記の様な関数は、自動的にNULL('\0')を付加しないので自分で追加してあげる必要があります。 参考URL http://www9.plala.or.jp/sgwr-t/lib/strncpy.html

関連するQ&A

  • PHPのsubstr関数をC++とObjective-C++に置き換え

    PHPのsubstr関数をC++とObjective-C++に置き換える方法 ・PHP $s = "abcdefg"; $t = substr($s, 3, 2); というPHPのソースから C++と Objective-C++に変更したいのですが どう記述すればよいのでしょうか? ・C++ char s[] = "abcdefg"; ??? ・Objective-C++ iOSは3.2です。 NSString *s = @"abcdefg"; ???

    • ベストアンサー
    • Mac
  • C(char *s1)の文字列をObjective-Cの文字列(NSS

    C(char *s1)の文字列をObjective-Cの文字列(NSString *s2)にするにはどうしたらよいのでしょうか? char s1[] = "abc"; NSString *s2 = [[NSString alloc] initWithUTF8String:s1];  // (A) NSLog(@"s2=[%s]", s2); 結果がabcかなと思っていましたが、読めない変な文字が表示されました。 (A)を NSString *s2 = [NSString stringWithFormat:@"%s", s1]; に変えても同じでした。 s1のC文字列は日本語を含まないアルファベットの文字列なのになぜ?と 困っています。 Objective-Cの初心者で申し訳ありません。

  • strncpyと_tcsncpy_sのヌルの扱いが違う点

    strncpyの場合は、\0を付加しないのですが、_tcsncpy_sは ヌルを付加しますが、これは仕様でしょうか? 同じ意味の関数なのにヌルの振る舞いが異なると勘違いします。 TCHAR型を扱う関数で、strncpyと同じようにnullを付加しない関数はあるのでしょうか? このあたりについて詳しく書かれている本も探しております。 strcpy(buf1, "aaaaa"); strncpy(buf1, "b", 1); 結果 buf[0] = "b" buf[1] = "a" buf[2] = "a" buf[3] = "a" buf[4] = \0 _tcscpy_s(buf1, sizeof(buf1), "aaaaa"); _tcsncpy_s(buf1, sizeof(buf1), "b", 1); 結果 buf[0] = "b" buf[1] = \0 buf[2] = "a" buf[3] = "a" buf[4] = \0

  • 教えて下さい。

    C言語初心者のものです。 以下のコーディングをして場合、システム的にはどんな風な動きになっているかを教えて頂きたいんですが。。 ((1)~(3)の答えは一緒です。(4)のみ異なりなす。) char char1[7] = "abcdefg"; char char2[7] = "hijklmn"; (1)strncpy( (char *) char2[0], (char *) &char1,1); printf("char1=%s \n",char1); printf("char2=%s \n",char2); (2)strncpy( (char *) char2[0], (char *) char1,1); printf("char1=%s \n",char1); printf("char2=%s \n",char2); (3)strncpy( (char *) char2[0], char1,1); printf("char1=%s \n",char1); printf("char2=%s \n",char2); (4)strncpy(&char2[0],&char1[0],1); printf("char1=%s \n",char1); printf("char2=%s \n",char2); --------------------------------------------- 出力内容 (1) char1=abcdefg char2=hijklmnabcdefg (2) char1=abcdefg char2=hijklmnabcdefg (3) char1=abcdefg char2=hijklmnabcdefg (4) char1=abcdefg char2=aijklmnabcdefg

  • objective-c

    初心者です。よかったら、どなたかお答えをおねがいします。 #import <Foundation/Foundation.h> int main (void) { const char *words[] = {"asldkfj",";ljasdf",";lkasj","ioisdji"}; /ここ/ int charsize; charsize = sizeof(words) / sizeof(words[0]); int i; for(i = 0; i < charsize ;i++){ NSLog(@"%s is %d characters long",words[i],strlen(words[i])); } return 0; } 上記のソースでは、wordsがポインタ変数になってますが、配列で、 const char words[] = {"asldkfj",";ljasdf",";lkasj","ioisdji"}; にするとエラーがでます。 配列にすると、要素数は判別できるが、文字数は判別できないってことでしょうか? そうだとしたら、理由を教えてください。 よろしくお願いします。

  • Objective-cでNSLogが使えない

    Objective-cのNSLogで標準出力に出力したいのですが、 どうにもうまくいきません。 ソース $ cat oshiete.m #import <Foundation/Foundation.h> int main(int argc,const char * argv[]) {   NSLog(@"Hello World!");   return 0; } コンパイル $ clang -lgnustep-base -lobjc -I/usr/include/GNUstep -I/usr/lib/gcc/i486-linux-gnu/4.4/include -g -Wall oshiete.m -o oshiete 実行 $ ./oshiete Segmentation fault OSはUbuntu 10.04.1 LTSで、コンパイラはclangを使用しています。 gdbでステップ実行すると、NSLog実行時に以下のエラーが得られました。 Program received signal SIGSEGV, Segmentation fault. 0xb7c52e46 in __objc_get_forward_imp () from /usr/lib/libobjc.so.2 Objective-cが良く理解できてないのですが、Gnustepライブラリとリンクして 動作しているはずなので、そこの動きがよくない?? コンパイルでのエラーや警告は0件です。 自力での解決が困難です。 どなたかお力添えをお願いいたします。

  • Objective-Cで、NSStringのオブジェクトの解放を行って

    Objective-Cで、NSStringのオブジェクトの解放を行っているサンプルをよく見るのですが NSString *s = @"test"; const char *p = [s UTF8String]; [s release]; ... ここでpにアクセスするとどうなるのでしょうか? [s release]とおおもとを解放しているので怪しいと思いますがそれは正しいでしょうか? あと関数内なら [s release]としなくても自動解放?(ガーベージコレクション) はしてくれるのでしょうか? Objective-Cでのメモリの有効期間や解放について詳しくかかれている本やサイトの情報も探しています。

    • ベストアンサー
    • Mac
  • C言語にて構造体のメンバがNULLであるかを判定するサンプルを作成して

    C言語にて構造体のメンバがNULLであるかを判定するサンプルを作成しています。 一応目的の動作はするのですが、プログラミングとして正しいか教えて頂ければと 思います。 <test.c> int main() { /* ---------------------------------------- */ /* 構造体のメンバ(NULL保障無し)がNULLか */ /* 比較するサンプル */ /* ---------------------------------------- */ char buf[50]; /* サンプル構造体 */ struct ST_test { int cd; char name[10]; int no; }; struct ST_test st_test; /* 構造体定義 */ memset(&st_test,0x00,sizeof(st_test)); /* 構造体初期化 */ memset(&buf[0],0x00,sizeof(buf)); /* 構造体初期化 */ /* 構造体に値セット */ st_test.cd = 12; memcpy(&st_test.name[0],"aabbccddee",sizeof(st_test.name)); st_test.no = 999; /* NULL判定 */ if(*st_test.name == 0x00) { printf("NULLです\n"); } else { printf("NULLではないです\n"); } return (0); }

  • objective-cで、バイナリの読み込みに関して。

    objective-cで、バイナリの読み込みに関して。 バイナリファイルが容易してあり。 例えば Cで下のようなソースで読み込みできるとします。 typedef struct tagTTestStruct { int data1; int data2; char data3; } TTestStruct; int main() { TTestStruct testdata; FILE *fp; fp = fopen( FILENAME , "rb" ); fread( &testdata , sizeof( testdata ) , 1 , fp ); fclose( fp ); printf( "data1 = %d , data2 = %d , data3 = %d\n" ,testdata.data1,testdata.data2,testdata.data3 ); return 0; } これを、objective-cらしく書くにはどうしたらいいのでしょうか、、、 nsdataやnsarchiverを調べてみたのですが、よくわからないんです。 また、参考になるようなサイトがあればおしえてほしいです。

  • Cでファイルの行数をカウントするには

    ファイルの中の行数をカウントするにはどうすればよいか プログラムの行数ならその行数分だけ またコメントや空白行もカウントするにはどうしたらよいか 以下のプログラムに追加したい場合どうしたらよいか教えてください。 #include <stdio.h> int main(int argc , char *argv[]){ char s[256]; int i; FILE *fin; int local; int nCount = 0; for(i = 1 ; i < argc ; i++){ printf("%s\n",argv[i]); local = 0; fin=fopen(argv[i],"r"); memset(s,0,sizeof s); while(fgets(s,sizeof s,fin) != NULL){ // printf("%s",s); local++; nCount++; } memset(s,0,sizeof s); while(fgets) printf("local count = %d\n",local); fclose(fin); } printf("grobal count = %d\n",nCount); return 0; }

専門家に質問してみよう