这个程序的输出在开头给出一个特殊字符。是什么原因?
#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();
}
答案 0 :(得分:4)
您无法在strcat()
上使用init
因为它未初始化,您至少需要nul
终止符,例如
init[0] = '\0';
但我建议改为strcpy()
,
strcpy(init, "10101010");
不需要上面提到的初始化,但需要额外的字符。
但是你需要为nul
终结者添加一个额外的字符,即
char init[9];
而不是char init[8]
。
另外,gets()
是一个不推荐使用的函数,因为它有可能溢出缓冲区,你应该使用fgets()
,比如
fgets(str, sizeof(str), stdin);
答案 1 :(得分:3)
您需要使用NUL
终止字符串才能使用strcat
更改
char init[8];
char final[8];
到
char init[8] = "";
char final[8] = "";
请注意,gets
已弃用,请更改为
fgets(str, sizeof str, stdin);
/* remove the trailing newline */
char *ptr = strchr(str, '\n');
if (ptr) *ptr = '\0';
答案 2 :(得分:0)
strcat()
,因为在它可以执行它之前必须找到当前字符串的结尾。由于init
和final
应为空,因此最好使用strcpy()
。
此外,C中的字符串以空值终止,这意味着在结尾处始终是一个额外的符号\0
。存储字符串10101010
实际上需要9个字节。 <{1}}和init
只能占用8个字节。
此外,您正在尝试final
。此时strcat(init, str)
已满,因此您尝试附加到它的任何其他init
超出限制并覆盖堆栈。此应用程序将调用未定义的行为并可能崩溃。 char
必须足够大才能保留init
加上9个字节的内容。