2017-02-04 15 views
0

Это код. Он должен иметь раздел перед void main() в нем, так как это требования, которые мне сказали для кода. Материал после void strcopy должен храниться до void main().Программа, которая копирует одну строку в другую, которая включает в себя функцию, печатает странные символы

#include <stdio.h> 


void strcopy(char * string1, char * string2) 
{ 
    int i = 0; 

    while (string1[i] != '\0') { 
     string2[i] = string1[i]; 
     i++; 
    } 
    return; 
    /* copies string1 to string 2 */ 
} 

void main() 
{ 
    char string1[1000], string2[1000]; 
    int i; 


    printf("Enter the string: \n"); 
    scanf("%[^\n]s", string1); 

    printf(" %s ", string2); 

    return; 
} 

Это то, что печатается, и я в тупике. Может кто-нибудь помочь мне, пожалуйста?

Enter the string: 
hello 
t��\� 

Благодаря

+2

Вы никогда не называли 'strcopy()', поэтому 'string2()' неинициализирован. – Barmar

+1

shoud use 'scanf ("% 999 [^ \ n] s ", string1);' вместо этого для предотвращения переполнения буфера. – RoadRunner

ответ

1

Во-первых, вы не вызываете strcopy, так что вы напечатать только неинициализированную содержание string2. Во-вторых, в strcopy вы забыли завершить целевую строку (обратите внимание, что ваш цикл завершается до того, как будет написано `\ 0 '). Написать:

void strcopy(char * string1, char * string2) 
{ 
    int i = 0; 

    while (string1[i] != '\0') { 
     string2[i] = string1[i]; 
     i++; 
    } 
    string2[i]='\0'; 
    return; 
    /* copies string1 to string 2 */ 
} 

Если вы не завершить строку, то все байты в целевой памяти трактуется как «принадлежность к строке» до тех пор, 0x0 байт не будет достигнута. И эти байты могут произвести такой странный вывод.

0

Но вы никогда не звонили strcopy().

Добавьте вызов функции после чтения ввода:

strcopy(string1, string2); 

Другие вопросы:

  • main() функция должна возвращать int. Итак, измените определение на: int main(void) {... и верните значение int, такое как return EXIT_SUCCESS;.
  • Вы не ввели нулевой байт в пункт назначения. Вам это нужно, потому что вы печатаете его как строку, используя %s. Добавьте string2[i] = 0; после цикла while.
  • Извлеките s из спецификатора формата scanf(). %[^\n] достаточно, чтобы прочитать новую строку. Вместо этого вы можете рассмотреть возможность использования fgets(). Потому что scanf(), как вы используете, - восприимчив к переполнению буфера и generally inferior.