2015-04-07 17 views
-2

В чем разница в следующем? (С)(C) Изменения размера массива Char после ввода?

char x[100] ; 
char y[] = ""; // no space between the double quotations 
char z[] = " "; // space between the double quotations 

если пользователь ввел вход для примера «тест» в массиве у, делает это изменения размера до 5?

char y[] =""; 
gets(y); // user entered "test" 

, и если пользователь вводит ввод размером более 100 в массиве x, изменяется ли его размер?

char x[100] ; 
gets(x); // user entered an input larger than 100 

и почему этот код работает: (если пользователь ввел "тест", он будет печатать "тест")

#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 ; 
} 

и это один не делает? (Это один печатает странные символы) (если пользователь ввел «тест» будет печатать «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 ; 
} 

и это один работает, используя (путы) даже без пробела между двойными цитатами:

#include<stdio.h> 
#include<string.h> 

int main(){ 
    char name[] = "" ; 
    gets(name); 
    puts(name); 
    return 0 ; 
} 
+0

Это ваша домашняя работа? – Eregrith

+0

Никогда не используйте 'gets()' специально в вашем случае, это очень плохая идея. –

+0

некоторая информация http://stackoverflow.com/questions/27243188/difference-between-assigning-strings/27243241#27243241 –

ответ

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++) 
+0

благодарит за помощь :), информация о неопределенном поведении была очень полезной ... и мне понравилась идея этого цикла для (int i = 0; name [i]! = '\ 0'; i ++) – Saidar

0

Если пользователь ввел ввод, например, «тест» в массиве y, изменился ли размер на 5?

Количество Размер массива является постоянным. (1 в случае y)

и, если пользователь ввел вход больше, чем 100 в массиве х, делает это изменения размера?

No. Размер массива является постоянным. (100 в случае x)

В обоих случаях код вызывает Undefined Behavior (что означает, что все может случиться) в качестве дополнительных символов ввода написаны в недействительных местах. Вот почему the gets() function is dangerous тоже! Причина в том, что gets() не мешает buffer overflows.

и почему этот код работает: (если пользователь ввел «тест», он будет печатать «тест»)

Все, что может произойти, если входной сигнал имеет длину более одного символа. Опять же, из-за Undefined Behavior

она работала без цикла, даже при отсутствии пространства между двойными цитатами

UB

и это один работает, используя (путы) даже без пробела между ними Двойные котировки:

UB

+0

большое спасибо за помощь :) – Saidar

Смежные вопросы