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'?编译器的?
答案 0 :(得分: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
内存。
答案 1 :(得分: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;
}
这是解决您正在解决的问题的一种更安全的方式。
祝你好运!