我必须在不使用\ 0的情况下将字符串放入另一个字符串中,我尝试了很多方法,但字符串总是很脏。
char string[100];
int pos=0;
fgets(string, 99, stdin);
len = strlen(string);
printf("%d\n", len);
char array[len-1];
for(pos=0; pos<(len-1); pos++)
{
array[j]=string[pos];
j++;
}
printf("%s", string);
printf("%s", array);
在终端我有: 狗狗(ENTER) 10(ENTER) 狗狗(ENTER) 狗狗@
我也尝试使用另一个符号删除\ 0,但它看不到'\ 0'或'\ n',请帮我PLZ!
答案 0 :(得分:2)
在没有长度规范的情况下将指向非空终止字符串的指针传递给%s
将调用未定义的行为。如果您因某种原因讨厌终止空字符,则必须指定要打印的长度。
试试这个:
#include <stdio.h>
#include <string.h>
int main(void) {
int len;
char string[100];
int pos=0;
fgets(string, 99, stdin);
len = strlen(string);
printf("%d\n", len);
char array[len];
for(pos=0; pos<len; pos++)
{
array[pos]=string[pos];
}
printf("%s", string);
printf("%*s", len, array);
return 0;
}
答案 1 :(得分:0)
TL; DR 你不想要null-terminator,很好。除此之外,您应该准备放弃那些属性,这些属性伴随着null-terminator的存在。您无法再将array
用作字符串。
详细说明,在您的代码中,您的数组array
不是以空值终止的,因此它不能用作字符串。 %s
格式说明符需要指向以null结尾的char
数组的指针(简而言之, string )
所以,在你的代码中,
printf("%s", array);
通过遍历已分配的内存来搜索空终止符来调用undefined behavior。
但是,您可以使用for
循环逐个元素地打印它。
答案 2 :(得分:0)
要复制而不使用终止null,请使用
memcpy( myCharArray, string, strlen(string) );
(假设myCharArray的大小是足够的)。要打印出结果,您需要使用循环而不是printf。