C奇怪的字符串输出

时间:2016-07-29 03:52:37

标签: c

我尝试运行这个简单的代码

#include <stdio.h>
#include <string.h>

int main() { 
    char first[20];
    char last[20];
    char full[40];

    printf("Your first name?: ");
    fgets(first, sizeof(first), stdin);
    printf("your last name?: ");
    fgets(last, sizeof(last), stdin);
    first[strlen(first) - 1] = '\0';
    strcat(full, first);
    strcat(full, " ");
    strcat(full, last);
    printf("Your full name is: %s", full);
}

并且返回的输出是..

Your first name?: Daniel
your last name?: Jee
Your full name is: pA▒Daniel Jee

谁能告诉我这是什么?

3 个答案:

答案 0 :(得分:4)

full未初始化,

strcat(full, first);调用未定义的行为。

垃圾内容是一种温和形式的未定义行为。

您应该使用:

strcpy(full, first);

或更好:

#include <stdio.h>
#include <string.h>

int main(void) { 
    char first[20];
    char last[20];
    char full[40];

    printf("Your first name? ");
    if (!fgets(first, sizeof(first), stdin))
        return 1;
    printf("your last name? ");
    if (!fgets(last, sizeof(last), stdin))
        return 1;
    first[strlen(first) - 1] = '\0';
    snprintf(full, sizeof full, "%s %s", first, last);
    printf("Your full name is: %s", full);
    return 0;
}

请注意,full很可能包含尾随换行符。

答案 1 :(得分:2)

C中的堆栈变量未初始化。在没有先设置strcat(full, first);的情况下,您执行了full[0]=0;

答案 2 :(得分:1)

您应该将第一个字符串复制为完整字符。

#include <stdio.h>
#include <string.h>

int main()
{ 
    char first[20];
    char last[20];
    char full[40];

    printf ("Your first name?: ");
    fgets(first, sizeof(first), stdin);
    printf("your last name?: ");
    fgets(last, sizeof(last), stdin);
    first[strlen(first) - 1] = '\0';
    strcpy(full, first);
    strcat(full, " ");
    strcat(full, last);
    printf ("Your full name is: %s", full);
}