1
char a[10];
scanf("%s",a);
int i=0;
while(a[i]!='\0')
     printf("\n%c",a[i++]);  //similar to printf("%s",a);               


char *b;
b=malloc(10*sizeof(char));
scanf("%s",b);
i=0;
while((b+i)!='\0')
     printf("\n%c",*(b+i++));   //not similar to printf("%s",a);

入力"abcd"の場合、最初のループはa []を出力します。これは、printf()を使用する場合です。しかし、同じことは*bには当てはまりません。

2番目のループは、「\0」に遭遇するまであまりにも多く続きます。

つまり、これは、文字列の最後に「\ 0」が自動的に追加されるが、char型ポインターの最後には追加されないことを意味しますか?

そして、この'\ 0'を追加するのは誰の仕事ですか?コンパイラの?

4

2 に答える 2

7

で取得したポインタを逆参照するのを忘れましたb+i。そのはず:

while (*(b + i) != '\0') // or while (b[i] != '\0') or while(b[i])

b + iアドレスを取得するだけで、それを逆参照して、メモリが指しているものを実際に調べ、それがNULターミネータであるかどうかを確認する必要があります。表記は。x[y]と同等*(x + y)です。

freeまた、で割り当てたメモリも忘れないでくださいmalloc

于 2012-05-07T16:03:04.367 に答える
1

間接参照の問題。

行(b + i)は、次のいずれかに置き換える必要があります。

*(b+i)

また

b[i]

さらに、文字列を取り込むだけの場合は、scanfの代わりにfgets()を使用することを検討してください。これにより、ユーザーが入力しすぎてプログラムがクラッシュするのを防ぐことができます。

最後に、malloc()の代わりにcalloc()を使用することを検討してください。これは、割り当てる配列の内容をランダムなガベージではなくすべてゼロに自動的に設定するためです。

例として:

#include <stdio.h>
#define MAX_BUFFER_LENGTH
int main(void) {
  char a[MAX_BUFFER_LENGTH];
  char *b;
  fgets(a,MAX_BUFFER_LENGTH,stdin);
  int i=0;
  while(a[i]!='\0') {
     printf("\n%c",a[i++]);
  }

  b=calloc(MAX_BUFFER_LENGTH,sizeof(char));
  fgets(b,MAX_BUFFER_LENGTH,stdin);
  i=0;
  while(*(b+i)!='\0') {
    printf("\n%c",*(b+i++));
  }
  // Done
  return 0;
}

これは、解決しようとしている問題に取り組むためのはるかに安全な方法です。

幸運を!

于 2012-05-07T16:20:14.833 に答える