То, что вы хотите сделать, сложно с scanf из-за проблем с захватом символа новой строки.
С fgets
символ новой строки захватывается как часть массива char. Просто проверьте, содержит ли ввод новую строку, и вы знаете, что больше нет символов для чтения.
В string.h
есть полезные функции, которые делают этот код намного короче, такие как strchr
и strcspn
.
#include <stdio.h>
int main( void) {
char a[14];
char b[14];
int toolong = 1;
do {
int retry = 0;//not retry
toolong = 1;//too long
printf ( "give string with no more than 12 characters ");
if ( fgets ( a, sizeof a, stdin)) {//read a line
int each = 0;
while ( a[each]) {
if ( '\n' == a[each]) {//found a newline
if ( ! retry) {//not retry
toolong = 0;//not too long
a[each] = 0;//remove newline
}
else {
printf ( "try again cause you typed more than 12\n");
}
break;
}
each++;
if ( ! a[each]) {//found zero terminator at end of line
if ( ! fgets ( a, sizeof a, stdin)) {//read more to find newline
fprintf ( stderr, "fgets EOF\n");
return 0;
}
each = 0;//start over at [0]
retry = 1;//retry
}
}
}
else {
fprintf ( stderr, "fgets EOF\n");
return 0;
}
} while ( toolong);
do {
int retry = 0;
toolong = 1;
printf ( "give second string with no more than 12 characters ");
if ( fgets ( b, sizeof b, stdin)) {
int each = 0;
while ( b[each]) {
if ( '\n' == b[each]) {
if ( ! retry) {
toolong = 0;
b[each] = 0;
}
else {
printf ( "try again cause you typed more than 12\n");
}
break;
}
each++;
if ( ! b[each]) {
if ( ! fgets ( b, sizeof b, stdin)) {
fprintf ( stderr, "fgets EOF\n");
return 0;
}
each = 0;
retry = 1;
}
}
}
else {
fprintf ( stderr, "fgets EOF\n");
return 0;
}
} while ( toolong);
printf ( "you gave %s & %s\n", a, b);
return 0;
}
Использование string.h
и помещение дублирующего кода в функцию делает его намного короче.
#include <stdio.h>
#include <string.h>
char *strlimit ( char *str, int limit) {
int toolong = 1;
do {
toolong = 0;// not too long
printf ( "give string with no more than 12 characters ");
if ( fgets ( str, limit, stdin)) {//read a line
if ( ! strchr ( str, '\n')) {//no newline
while ( ! strchr ( str, '\n')) {//look for newline
fgets ( str, limit, stdin);//read more
}
toolong = 1;// too long
printf ( "try again cause you typed more than 12\n");
}
str[strcspn ( str, "\n")] = 0;//remove newline
}
else {
fprintf ( stderr, "fgets EOF\n");
return NULL;
}
} while ( toolong);
return str;
}
int main( void) {
char a[14];
char b[14];
if ( ! strlimit ( a, sizeof a)) {
return 0;
}
if ( ! strlimit ( b, sizeof b)) {
return 0;
}
printf ( "you gave %s & %s\n", a, b);
return 0;
}