Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 静态数组与动态数组_C_Arrays_Pointers - Fatal编程技术网

C 静态数组与动态数组

C 静态数组与动态数组,c,arrays,pointers,C,Arrays,Pointers,对于输入“abcd”,第一个循环打印一个[],它将与printf()一起打印。但对于*b来说,情况并非如此 第二个循环持续太多,直到遇到“\0” 那么,这是否意味着“\0”会自动追加到字符串的末尾,而不会追加到字符类型指针的末尾 附加这个'\0'是谁的工作?编译器?您忘了取消引用使用b+i获得的指针。应该是: char a[10]; scanf("%s",a); int i=0; while(a[i]!='\0') printf("\n%c",a[i++]); //similar t

对于输入“abcd”,第一个循环打印一个[],它将与printf()一起打印。但对于*b来说,情况并非如此

第二个循环持续太多,直到遇到“\0”

那么,这是否意味着“\0”会自动追加到字符串的末尾,而不会追加到字符类型指针的末尾


附加这个'\0'是谁的工作?编译器?

您忘了取消引用使用
b+i
获得的指针。应该是:

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);
b+i
只要给你一个地址,你就必须去引用它,看看内存指向什么,看看它是否是NUL终止符。
x[y]
符号相当于
*(x+y)


另外,不要忘了
释放
分配给
malloc
的内存您忘了取消引用使用
b+i
获得的指针。应该是:

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);
b+i
只要给你一个地址,你就必须去引用它,看看内存指向什么,看看它是否是NUL终止符。
x[y]
符号相当于
*(x+y)

另外,不要忘记
释放
分配给
malloc

解除引用问题的内存

在第(b+i)行中,应替换为:

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

另外,如果您只接受字符串,则应该考虑使用FGSH()代替SCANF,因为它可以帮助用户避免键入过多的字符并破坏程序。

最后,您可以考虑使用CALROCLE()代替MalCube(),因为它自动设置您所分配的数组的内容为全零而不是随机垃圾。 例如:

b[i]
#包括
#定义最大缓冲区长度
内部主(空){
字符a[最大缓冲区长度];
char*b;
fgets(a,最大缓冲区长度,标准输入);
int i=0;
而(a[i]!='\0'){
printf(“\n%c”,a[i++]);
}
b=calloc(最大缓冲区长度,sizeof(char));
fgets(b,最大缓冲区长度,标准输入);
i=0;
而(*(b+i)!='\0'){
printf(“\n%c”,*(b+i++”);
}
//完成
返回0;
}
这是处理您正在解决的问题的更安全的方法

祝你好运

解引用问题

在第(b+i)行中,应替换为:

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

另外,如果您只接受字符串,则应该考虑使用FGSH()代替SCANF,因为它可以帮助用户避免键入过多的字符并破坏程序。

最后,您可以考虑使用CALROCLE()代替MalCube(),因为它自动设置您所分配的数组的内容为全零而不是随机垃圾。 例如:

b[i]
#包括
#定义最大缓冲区长度
内部主(空){
字符a[最大缓冲区长度];
char*b;
fgets(a,最大缓冲区长度,标准输入);
int i=0;
而(a[i]!='\0'){
printf(“\n%c”,a[i++]);
}
b=calloc(最大缓冲区长度,sizeof(char));
fgets(b,最大缓冲区长度,标准输入);
i=0;
而(*(b+i)!='\0'){
printf(“\n%c”,*(b+i++”);
}
//完成
返回0;
}
这是处理您正在解决的问题的更安全的方法


祝你好运

在这种情况下,
scanf
有责任附加
\0
。投票“太本地化”,因为提问者要求删除它,问题与提问者认为它与什么无关。这里真正的问题与静态/动态数组或提问者文本中的任何其他内容无关。它是“我输入了
(b+I)
而不是第二段中的
b[I]
”,正确答案是“是”;-)在这种情况下,
scanf
有责任附加
\0
。投票“太本地化”,因为提问者要求删除它,问题与提问者认为它与什么无关。这里真正的问题与静态/动态数组或提问者文本中的任何其他内容无关。它是“我输入了
(b+I)
而不是第二段中的
b[I]
”,正确答案是“是”;-)另外,rudra注意到
b[i]
也是有效的。@Joe肯定是的,添加了一条关于这个的注释。哎呀!请删除这个问题@rudra
scanf
函数将在它读取的字符串末尾附加一个NUL。但是,您的工作是确保数组足够大,可以容纳字符串
scanf
reads和NUL终止符。顺便说一句,您可以通过在
%
s
之间放置一个数字来指定
scanf
字符串的长度,如
scanf(“%9s”,b)
,其中
9
是您希望
scanf
读取的最大字符数。(我使用了9,因为您的缓冲区是10)。@rudra如果您输入的字符超过10个,
scanf
将写入超出数组末尾的内容。如果写入(或读取)超出数组末尾,则会出现未定义的行为,这意味着可能发生任何情况。它可能看起来有用(就像它为你做的那样),它可能会崩溃,它可能会让你的头发着火,或者任何它想要的东西。你不知道。但它仍然是程序中的一个bug,您应该小心避免,因为在其他时间或其他人的计算机或其他平台上,它可能不会以相同的方式运行。请记住,C不能确保你做的事情是正确的。另外,鲁德拉注意,
b[i]
也是有效的。@Joe肯定是的,添加了一条关于这一点的注释。哎呀!请删除这个问题@rudra
scanf
函数将在它读取的字符串末尾附加一个NUL。但是,您的工作是确保数组足够大,可以容纳字符串
scanf
reads和NUL终止符。顺便说一句,您可以通过在
%
s
之间放置一个数字,给出
scanf
所需字符串的长度,如
scanf(“%9s”,b)
,其中
9
是所需的最大字符数