2017-02-04 144 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

应该使用'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将它打印为字符串。 while循环后添加string2[i] = 0;
  • scanf()的格式说明符中删除s%[^\n]就足以读取换行符。相反,你可能会考虑使用fgets()。因为您使用的是scanf() - 容易受到缓冲区溢出的影响,并且generally inferior
相关问题