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

时间:2015-04-18 16:03:21

标签: 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();
    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();
}

3 个答案:

答案 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(),因为在它可以执行它之前必须找到当前字符串的结尾。由于initfinal应为空,因此最好使用strcpy()

此外,C中的字符串以空值终止,这意味着在结尾处始终是一个额外的符号\0。存储字符串10101010实际上需要9个字节。 <{1}}和init只能占用8个字节。

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