1. Dane w postaci linii, wczytuj z użyciem fgets(...). scanf(...) dla stringów jest niebezpieczne a getchar(...) wymaga dużo kodu.
2. Sprawdzenie czy wszystkie znaki są literami lub "znakiem białym" (pomiędzy imieniem/imieniami i nazwiskiem/nazwiskami, może być np. tabulator), wydzielił bym do osobnej funkcji.
3. Stałe dla wielkości tablic, definiuje się w C jako #define.... lub... używa się alokacji dynamicznej :)
4. Staraj się wydzielać logiczne części programu do oddzielnych funkcji.
5. Co do zasady, z funkcji powinno być 1 wyjście return. Stąd w przykładzie zmienna result.
6. Nie zostawiaj zmiennych bez inicjalizacji.
7. Lepsze dla result, było by stdbool.h, ale jak widzę po kodzie, piszesz w standardzie sprzed C99.
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#define SIZE 3
#define LENGTH 60
int read_names(char names[SIZE][LENGTH]);
void show_names(char names[SIZE][LENGTH]);
int normalize_check(char * str);
int read_names(char names[SIZE][LENGTH])
{
int result = 1;
int i = 0;
puts("Podaj imiona i nazwiska:");
for(i = 0; i < SIZE; ++i)
{
fgets(names[i], LENGTH, stdin);
/* Usunięcie ostatniego '\n' bo fgets(...) wczytuje go do bufora */
names[i][strlen(names[i]) - 1] = '\0';
if(! normalize_check(names[i]))
{
fputs("Incorrect input data!\n", stderr);
result = 0;
break;
}
}
return result;
}
void show_names(char names[SIZE][LENGTH])
{
int i = 0;
for(i = 0; i < SIZE; ++i)
{
puts(names[i]);
}
}
int normalize_check(char * str)
{
int result = 1;
while('\0' != *str)
{
if(isalpha(*str) || isblank(*str))
{
*str = toupper(*str);
}
else
{
result = 0;
break;
}
++str;
}
return result;
}
int main(void)
{
int result = EXIT_SUCCESS;
char names[SIZE][LENGTH] = {'\0'};
if(read_names(names)) {
show_names(names);
}
else
{
result = EXIT_FAILURE;
}
return result;
}
PS. Tak, wiem że przykład wyszedł nieco "hiperpoprawny".... :)