2014-08-28 3 views
2

Я написал программу на C, и я смущен о выходе программы. Программа выглядит так:получает метод в программе C

int main() 
{ 
    char arr1[13] = "abcdefg"; 
    char arr2[10]; 
    gets(arr2); 
    puts(arr2); 
    strncat(arr1, arr2, 5); 
    puts(arr1); 
    puts(arr2); 

    return 0; 
} 

I вход «QWERTYUIOP», и результат:

qwertyuiop 
qwert 
qwertyuiopqwert 

Может кто-нибудь сказать мне, почему значение arr1 превратилась в «QWERT»? Большое спасибо!

+0

Возможный дубликат [Как может превышать память, выделенную malloc()?] (Http://stackoverflow.com/questions/20094586/how-can-gets-exceed-memory-allocated-by- malloc) – anatolyg

ответ

2

Не используйте gets для считывания данных от пользователя. Если вы вводите ввод больше, чем размер массива arr2[10], массив хранит 10 байтов, поэтому для \0 нет места. Это приводит к «Неопределенное поведение»

Благодаря этому вы getting-

qwertyuiop 
qwert 
qwertyuiopqwert // Note the extra characters with arr2, That is more then your input 

Использование fgets для чтения ввода из USER-

fgets(arr2,10,stdin); 

Затем программа работает нормально. Попробуйте change-

#include<stdio.h> 
#include<string.h> 
int main() 
{ 
    char arr1[13] = "abcdefg"; 
    char arr2[10]; 
    // gets(arr2); 
    fgets(arr2,10,stdin); // it will read only 9 characters from user, 1 byte for null 
    puts(arr2); 
    strncat(arr1, arr2, 5); 
    puts(arr1); 
    puts(arr2); 

    return 0; 
} 

output-

[email protected]:~/My Docs/Programs# ./a.out 
qwertyuiopasdf <- i have entered more than 10 character. But it reads only first 9 byte 
qwertyuio 
abcdefgqwert 
qwertyuio 
+0

Но такая же программа отлично работает на моей машине. Независимо от того, что получает, я получаю правильный вывод (для этой проблемы). –

+2

@Abhishek Может быть, вам повезло !. Неопределенный может произойти в любое время! Потому что это не определено! – Sathish

+0

Я хотел сказать, что в отношении поставленного вопроса не должно быть проблем с использованием get. –

0

Значение arr1 не «QWERT»
Я скомпилировал и запустил программу, и это дает следующие выходные данные

выхода консоли:

[[email protected] replies]# ./rep2 
qwertyuiop  
qwertyuiop 
abcdefgqwert 
qwertyuiop  
[[email protected] replies]# 

программа работает нормально.
здесь strncat работает отлично.

+0

Возможно, программа не работает нормально, она имеет 2 переполнения буфера, что приводит к неопределенному поведению. – nos

+0

@nos в отношении поставленного вопроса, не должно быть никаких проблем –

+0

qwertyuiop считывается в arr2, это 10 символов + нулевой байт, переполненный arr2 на 1 байт. – nos

2

Функция gets считывает строку из стандартного ввода, пока не появится либо символ новой строки или конец файла. В обоих случаях он добавляет байт NUL в конце.

Ваша строка ввода qwertyuiop составляет 10 символов, поэтому общая длина строки составляет 11 символов. Вы выделили только 10 символов в своем массиве. Таким образом, поведение вашей программы не определено. Это может быть segfault или вести себя странно.

Фактически, функция gets по своей сути опасна. man page говорит

Никогда не использует gets(). Потому что невозможно сообщить, не зная заранее данные , сколько символов будет читать(), а потому, что gets() будет продолжать хранить символы за конец буфера, крайне опасно использовать. Он был использован для взлома компьютера безопасности. Вместо этого используйте fgets().