2016-07-29 3 views
-2

Я попытался запустить этот простой код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 

Может кто-нибудь сказать мне, что это такое?

+2

Что сказал вам ваш отладчик? –

+1

Когда вы объявите полный, оно может уже иметь значения в памяти. Поскольку вы не установили все значения равными нулю, strcat объединяет первое имя в конец. Вам нужно скопировать имя в полное имя. Я бы посмотрел strncpy или strcpy, поскольку это могут быть некоторые полезные функции (я бы пошел с strncpy, чтобы не повредить память с помощью перезаписи. – Glenn

ответ

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, скорее всего, содержит завершающую новую строку.

2

Переменные стека в C не инициализируются. Вы сделали strcat(full, first); без предварительной настройки full[0]=0;.

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); 
} 
Смежные вопросы