C程序-输出中的特殊字符

C程序-输出中的特殊字符,c,C,这个程序的输出在开头给出了一个特殊的字符。原因是什么 #include<stdio.h> #include<conio.h> #include<string.h> main() { int i, j,count=0,nl; char str2[100]; char str1[100]; char str[100]; char init[8]; char final[8]; //clrscr();

这个程序的输出在开头给出了一个特殊的字符。原因是什么

#include<stdio.h>
#include<conio.h>
#include<string.h>
main() {
    int i, j,count=0,nl;
    char str2[100];
    char str1[100];
    char str[100];
    char init[8];
    char final[8];
    //clrscr();
    printf("enter the bit string:  ");
    gets(str);

    puts(str);
    strcat(init,"10101010");
    strcat(final,"10101010");
    strcpy(str1,(strcat(init,str)));
    strcpy(str2,(strcat(str1,final)));
    puts(str2);
    printf("%d",(strlen(str2)));
    getch();
}
#包括
#包括
#包括
main(){
int i,j,count=0,nl;
char-str2[100];
char-str1[100];
char-str[100];
char init[8];
半决赛[8];
//clrsc();
printf(“输入位字符串:”);
获取(str);
put(str);
strcat(初始,“10101010”);
strcat(最终版本,“10101010”);
strcpy(str1,(strcat(init,str));
strcpy(str2,(strcat(str1,final));
看跌期权(str2);
printf(“%d”)(strlen(str2));
getch();
}
您不能在
init
上使用
strcat()
,因为它未初始化,您至少需要
nul
终止符,例如

init[0] = '\0';
但我建议改为
strcpy()

strcpy(init, "10101010");
不需要上述初始化方法,但需要额外字符

但是,您需要为
nul
终止符添加一个额外字符,即

char init[9];
而不是
char init[8]

另外,
gets()
是一个不推荐使用的函数,因为它有可能使缓冲区溢出,所以您应该使用
fgets()
来代替,如

fgets(str, sizeof(str), stdin);

您需要一个
NUL
终止的字符串来使用
strcat

改变

char init[8];
char final[8];

请注意,
get
已被弃用,请更改为

fgets(str, sizeof str, stdin);
/* remove the trailing newline */
char *ptr = strchr(str, '\n');
if (ptr) *ptr = '\0'; 
strcat()
必须用于初始化的字符串,因为它必须先找到当前字符串的结尾,然后才能执行其操作。由于
init
final
应该为空,因此最好使用
strcpy()

此外,C中的字符串以null结尾,这意味着在末尾总是有一个额外的符号
\0
。存储字符串
10101010
实际上需要9个字节
init
final
只能占用8个字节

另外,您正在尝试
strcat(init,str)
<此时code>init
已满,因此您尝试附加到其中的任何附加
char
都将超出限制并覆盖堆栈。此应用程序将调用未定义的行为,可能会崩溃
init
必须足够大,以容纳
str
的内容加上9个字节。

不要使用
gets()
strcat()
必须用于初始化字符串,因为它必须先找到当前字符串的结尾,然后才能执行其操作。改为使用strcpy()。
fgets(str, sizeof str, stdin);
/* remove the trailing newline */
char *ptr = strchr(str, '\n');
if (ptr) *ptr = '\0';