Добавление строк в массив символов в C

По какой-то причине, когда я печатаю массив выше, я получаю странный вывод. Когда я запускаю этот код через терминал WinSCP, он также падает, как если бы это был бесконечный цикл. Тем не менее, я в основном ищу, чтобы исправить вывод на печать. Ввод: Том (введите) Джерри (введите) (введите, чтобы прервать) Выход: .N=?tom jerry

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

int main()
{
    int i, counter = 0;
    char nameArr[100] ;
    
    while (1)
    {
        printf("Enter a name: ") ;
        char word[25] ;
        // Grab input
        fgets (word, sizeof(word), stdin) ;
        
        // Break if no input
        if (strcmp (word, "\n") == 0)
            break ;
        
        // Checks if there is a number in the input
        for (i = 0 ; i < strlen(word) - 1 ; i++)
        {
            int isItADigit = isdigit(word[i]) ;
            if (isItADigit != 0)
            {
                printf("No no, number detected, no bueno!") ;
                return 0 ;
            }
        }
        // Adds word to array
        strcat(nameArr, word) ;
        // Future Usage
        counter ++ ;    
    }
    
    if (counter < 2 )
    {
        printf("Name is too short\n") ;
        return 0 ;
    }
    else if (counter > 4)
    {
        printf("Name is too long\n") ;
        return 0 ;
    }
    
    //printArray(nameArr) ;
    printf("%s", nameArr) ;
    
    return 0;
}

person Jon    schedule 26.03.2021    source источник
comment
Вы должны закончить строку символом '\0'. Или программа не знает, где заканчивается строка.   -  person stupidstudent    schedule 26.03.2021


Ответы (2)


Массив char nameArr[100] не инициализирован, поэтому содержит мусор. Это может быть, например, такая фигня: nameArr[0] = '.' nameArr[1] = 'N' nameArr[2] = ':' ...

Итак, вы должны написать: char nameArr[100] = {0};, чтобы инициализировать его 0, или сделать его статическим static char nameArr[100];, который также инициализирует его 0.

person Orielno    schedule 26.03.2021

Функция strcat требует, чтобы целевой массив уже был правильным нулевым значением. завершенная строка.

Поскольку вы не инициализировали массив nameArr, его содержимое неопределенно, и первый вызов strcat приведет к неопределенное поведение.

Вам нужно инициализировать массив перед его использованием:

char nameArr[100] = { 0 };  // Initialize to all zeros, which is the string terminator

Вы также должны добавить проверку, чтобы убедиться, что вы не выходите за пределы массива nameArr.


Кстати, помните, что fgets оставляет новую строку в буфере, а вам нужно удалить его, если вы не хотите, чтобы ваш nameArr содержал новые строки.

Это можно сделать с помощью функции strcspn:

fgets (word, sizeof(word), stdin) ;
word[strcspn(word, "\n")] = '\0';

И, наконец, вы действительно должны проверить, успешно ли выполнено fgets.

person Some programmer dude    schedule 26.03.2021