我尝试运行这个简单的代码
#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
谁能告诉我这是什么?
答案 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);
}