Помимо основного вопроса, в коде есть несколько проблем:
int main(){
char x[6];
// 1. an attack vector: lines with more than 6 characters will exceed buffer size
// 2. The s will never be matched,
// since %[^\n] consumes everything until EOF or \n
// the following char can't be 's'
scanf("%[^\n]s", x);
// if scanf fails, then x can be uninitialized:
printf("%i\n", strlen(x));
return 0;
}
Устранение проблем по одной:
scanf("%[^\n]", x); // still not good
Это будет читать до новой строки и останавливаться, но все равно может переполнить буфер:
scanf ("%5[^\n]", x); // better
Это позволит избежать переполнения буфера, ограничивая чтение до 5 символов. К сожалению, если ввод длинный, нет гарантии, что в конце будет записан нулевой терминатор. Также, если scanf завершится неудачно (как в вашем случае), то x будет неинициализирован:
char x[6] = ""; // fill NUL chars
scanf ("%5[^\n]", x); // better
Будет плохо работать, если, например, после чтения 3 символов возникнет проблема с вводом-выводом. Чтобы бороться с такого рода проблемами, проверьте код возврата:
char x[6] = ""; // fill NUL chars
int n_read = scanf ("%5[^\n]", x); // ok
if (n_read < 0) error...
else if (n_read == 0) newline or EOF...
else /*1*/ x is ready...
Обратите внимание, что вместо инициализации x = ""
, вероятно, лучше установить x[5] = '\0'
после scanf. Вместо этого я выбрал вариант инициализации, поскольку легче было постепенно представить ответ таким образом.