2016-06-08 2 views
0

Итак, я получил задачу сделать программу, которая будет принимать ввод, пока я не напишу "KRAJ". Но когда я печатаю его с puts(), он будет иметь 3 символа больше в первых трех местах. Скажем, я пишу "finish meKRAJ" он должен напечатать только "finish me", но он печатает "ć[]'finish me"gets() и puts() показывает символы, которые я не вводил

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
int main() 
{ 
    char text[100]; 
    char entry[100]; 
    int i; 
    int flag=1; 
    int flag2; 
    do{ 
     printf("Enter txt:finish by writing KRAJ\n"); 
     gets(entry); 
     for(i=0;i<strlen(entry);i++){ 
      if(entry[i] == 'K' && entry[i+1] == 'R' && entry[i+2] == 'A' && entry[i+3] == 'J'){ 
       strncat(text,entry,i); 
       flag=0; 
       flag2=1; 
       break; 
      } 
      else{ 
       flag2=0; 
      } 
     } 
    if(!flag2)strcat(text,entry); 
    }while(flag); 

    printf("\n You have entered:\n"); 
    puts(text); 
    //testing first char 

    printf("\nTesting first char:%c",text[0]); 
    printf("\ntxt lenght:%d",strlen(text)); 


return 0; 
} 
+4

Вы не должны использовать 'gets()', который неизбежно рискует переполнением буфера, устарел на C99 и удален в C11. – MikeCAT

+1

'printf (" \ ntxt lenght:% d ", strlen (текст));' будет вызывать * неопределенное поведение * для передачи данных, имеющих неправильный тип: '% d' вызывает' int', но то, что возвращается с 'strlen 'is' size_t'. – MikeCAT

+1

Вы используете переменную с автоматическим временем хранения 'text' без инициализации и вызова * неопределенного поведения *. – MikeCAT

ответ

3

Допустим, я пишу «закончить meKRAJ» это было бы напечатать только «закончить меня», но он печатает «C [ ] прикончить меня»

char text[100]; 

никогда не инициализируется, пока вы звоните

strncat(text,entry,i); 

и

if(!flag2)strcat(text,entry); 

Эти два вызова будут добавлять свои строки в любой мусор в text[100] при запуске программы.

+1

'никогда не инициализируется, но вы вызываете' это не обязательно, это обычная ошибка. Вызов 'strcpy' отсутствует перед' strcat' Конечно, эта программа имеет много других проблем. – Michi

+0

@Michi One [C Standard] (http://www.open-std.org/jtc1/sc22/wg14/ www/docs/n1570.pdf) определение «uninitialized» * не объявлено с инициализатором, и никакое присвоение ему не было , выполненное до использования *. Вызов 'strcpy()' будет назначением. Также обратите внимание, что ['strcat()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/strcat.html) требует, чтобы оба аргумента были строками с нулевым символом. –

+0

Согласитесь, но что происходит, если вход будет только 15, и вы инициализируете весь массив с помощью ZERO? – Michi

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