2016-10-24 12 views
0

私はいくつかの文字列の操作をしようとしていますが、私のポインタが時刻に指しているものをプリントアウトしようとすると、本当に奇妙な出力が得られます。私のポインタから奇妙な出力が得られるのはなぜですか?

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

int main(){ 

    size_t n = 10; 
    char *mystring = malloc(10); 
    int line = 0; 
    int tokens = 0; 
    char *ptr; 

    if(mystring==NULL){ 
      fprintf(stderr, "No memory\n"); 
      exit(1); 
    } 

    while(getline(&mystring, &n, stdin)>0){ 
      printf("len = %lu, mystring = %s\n", strlen(mystring), mystring); 
      printf("let's tokenize this string\n line = %d tokens = %d\n", line, tokens); 

      ptr = mystring; 

      printf("ptr = %ch\n", ptr[0]); 
    } 

return 0; 
} 

これは

のは、この文字列をトークン化させ ライン= 0のトークン= 0

PTR =ハロー= MYSTRING、私はハロー= 6でlen

を入力したときに、私の出力は次のようになりますhh

二重のhhは何ですか?

+4

私はあなたが '%c'を探していると信じています。最初のHは 'hello'の最初の文字から、2番目の文字は' printf'の 'h'からのものです。 – duncan

+0

私は馬鹿のように感じます。それを私に指摘していただきありがとうございます –

+0

私たちの心配はありません! – duncan

答えて

3

これは印刷しているものです。 ptr = <ptr[0]>hを印刷しています。 printf()ステートメントに%cの後に余分なhがあります。

 printf("ptr = %c\n", ptr[0]); 
0

文字を印刷するための書式指定子は%cです。 %chがあります。「次のパラメータで指定された文字を印刷し、次に 'h'を印刷します。

は、あなたのフォーマット文字列内の余分なhを取り除く:

printf("ptr = %c\n", ptr[0]); 
0
printf("ptr = %ch\n", ptr[0]); 

PTR = HH

ダブルHHとは何ですか?

最初hは、hello文字列の最初の文字から来てptr[0]に対応し、あなたがprintfフォーマット文字列で%cを使用するのでそこにあります。あなたが%c後、printfフォーマット文字列であり、それを置くので

h

があります。

正しいprintfの呼び出しは次のようになります:あなたはアドレス(ポインタ)を印刷したい場合、あなたは(あなたが%p書式指定子を使用することができます)this SO questionを検討する必要があります

printf("ptr = %c\n", ptr[0]); 

関連する問題