将一个字符串复制到另一个字符串的程序,其中包括打印奇怪字符
问题描述:
这是代码。它必须具有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��\�
感谢
答
首先,你不叫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字节。而这些字节可能会产生如此奇怪的输出。
答
但是你从来没有打电话给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。
你永远不会调用'strcopy()',所以'string2()'是未初始化的。 – Barmar
应该使用'scanf(“%999 [^ \ n] s”,string1);'而不是为了防止缓冲区溢出。 – RoadRunner