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 来说,情况并非如此。

第二个循环持续了太多,直到遇到'\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]

此外,如果您只是接收字符串,您应该考虑使用 fgets() 而不是 scanf,因为它可以帮助您避免用户输入太多字符而导致程序崩溃。

最后,您可能会考虑使用 calloc() 而不是 malloc(),因为它会自动将您分配的数组的内容设置为全零而不是随机垃圾。

举个例子:

#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 回答