以下有何不同? (C)
char x[100] ;
char y[] = ""; // no space between the double quotations
char z[] = " "; // space between the double quotations
如果用户在数组y中输入了例如“test”的输入,它的大小是否变为5?
char y[] ="";
gets(y); // user entered "test"
如果用户在数组x中输入的输入大于100,那么它的大小会改变吗?
char x[100] ;
gets(x); // user entered an input larger than 100
以及此代码的工作原理:(如果用户输入“test”,它将打印“test”)
#include<stdio.h>
#include<string.h>
int main(){
char name[] = " " ; // space between the double quotations
gets(name);
for(int i=0 ; i< strlen(name) ; i++) {
printf("%c",name[i]);
}
return 0 ;
}
这个没有? (这个打印奇怪的符号)(如果用户输入“test”,它将打印“t”和一个笑脸符号)
#include<stdio.h>
#include<string.h>
int main(){
char name[] = "" ; // no space between the double quotations
gets(name);
for(int i=0 ; i< strlen(name) ; i++) {
printf("%c",name[i]);
}
return 0 ;
}
这个让我发疯,它没有循环,即使双引号之间没有空格
#include<stdio.h>
#include<string.h>
int main(){
char name[] = "" ; // no space between the double quotations
gets(name);
printf("%c",name[0]);
printf("%c",name[1]);
printf("%c",name[2]);
printf("%c",name[3]);
return 0 ;
}
并且即使双引号之间没有空格,这个也可以使用(puts):
#include<stdio.h>
#include<string.h>
int main(){
char name[] = "" ;
gets(name);
puts(name);
return 0 ;
}
答案 0 :(得分:0)
不,数组没有调整大小。
它起作用的原因是因为行为是未定义的,并且可能发生的事情之一是它起作用。
当你这样做时,你写的超出数组的界限,取决于非法写入位置的数据会发生不同的事情。
永远不要使用gets()
,因为它不会阻止缓冲区溢出,这是你的程序正在做的事情,你应该使用fgets()
函数,它将数组的大小作为参数来防止写入超过大小字节到数组
fgets(array, sizeOfTheArray, stdin);
可以防止出现问题,代码也不会像您认为的那样“工作”。
此外,c中的字符串不会将其大小存储在任何位置,所以像你一样调用strlen()
是不好的,这个
for(int i=0 ; i< strlen(name) ; i++)
/* ^ do not do this */
会导致性能下降,您可以将值存储为
size_t length = strlen(name);
for(int i = 0 ; i < length ; i++)
或者,使用c字符串是非nul
字节序列后跟nul
字节的事实,如下所示
for(int i = 0 ; name[i] != '\0' ; i++)
答案 1 :(得分:0)
如果用户输入了输入,例如&#34; test&#34;在数组y中,它的大小是否变为5?
没有。数组的大小是常量。(在y
的情况下为1)
如果用户在数组x中输入的输入大于100,那么它的大小是否会发生变化?
没有。数组的大小是常量。(在x
的情况下为100)
在这两种情况下,代码触发Undefined Behavior(这意味着任何事情都可能发生),因为输入的额外字符被写入无效位置。这也是the gets()
function is dangerous的原因!原因是gets()
不会阻止buffer overflows。
以及此代码的工作原理:(如果用户输入&#34;测试&#34;它将打印&#34;测试&#34;)
如果输入的长度超过一个字符,则会发生任何事情。再次,因为Undefined Behavior
它没有循环,即使双引号之间没有空格
并且即使双引号之间没有空格,这个也可以使用(puts):