将一个字符串复制到包含该函数的另一个字符串的程序正在打印奇怪的字符

时间:2017-02-04 15:05:00

标签: c arrays function copy c-strings

这是代码。它必须在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 个答案:

答案 0 :(得分:1)

首先,您不要拨打strcopy,因此您只打印string2的未初始化内容。其次,在strcopy中,您忘记终止目标字符串(请注意,您的循环将在`\ 0&#39;之前终止)。写:

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 */
}

如果不终止字符串,则目标内存中的任何字节都被视为&#34;属于字符串&#34;直到达到0x0字节。而这些字节可能会产生如此奇怪的输出。

答案 1 :(得分:0)

但你从未打电话给strcopy()

读取输入后添加函数调用:

strcopy(string1, string2);

其他问题是:

  • main()函数应返回int。因此,请将定义更改为:int main(void) {...并返回int值,例如return EXIT_SUCCESS;
  • 您尚未将空字节插入目的地。您需要它,因为您使用%s将其打印为字符串。在while循环后添加string2[i] = 0;
  • s的格式说明符中删除scanf()%[^\n]足以读取换行符。相反,您可以考虑使用fgets()。因为您使用scanf() - 容易受到缓冲区溢出和generally inferior
  • 的影响