(C)输入后字符数组大小是否发生变化?

时间:2015-04-07 12:15:19

标签: c arrays string char

以下有何不同? (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 ;
}

2 个答案:

答案 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

  

它没有循环,即使双引号之间没有空格

UB

  

并且即使双引号之间没有空格,这个也可以使用(puts):

UB