Чтение строки с использованием fgets, не удалось получить вывод второй строки
Цель программы: получить количество вводимых строк, прочитать строку, перевернуть строку и распечатать строку. Продолжить со следующей строкой
#include <stdio.h> int main() { int num_tc, index_tc, char_idx, str_len = 0; char S[31]; scanf("%d\n", &num_tc); for (index_tc = 1; index_tc <= num_tc; index_tc++) { fgets(S, sizeof(S), stdin); /* To compute the string length */ for (char_idx = 0; S[char_idx] != NULL; char_idx++) str_len++; /* Reverse string S */ for (char_idx = 0; char_idx < str_len / 2; char_idx++) { S[char_idx] ^= S[str_len - char_idx - 1]; S[str_len - char_idx - 1] ^= S[char_idx]; S[char_idx] ^= S[str_len - char_idx - 1]; } puts(S); } return 0; }
Вход в программу
2<\n> ab<\n> aba<\n>
Выход
ba
Пожалуйста, дайте мне знать, почему вторая строка не берется для обращения строки.
- Если я уберу логику обращения строк, я смогу увидеть обе строки
1 ответ
Решение
Вы не сбрасываете str_len
в 0
в теле цикла. Длина второй строки неверна, поэтому вторая строка не полностью перевернута. Измените цикл на:
for (str_len = 0; S[str_len] != '\0'; str_len++)
continue;
Обратите внимание, что вы должны лишить трейлинг '\n'
прежде чем перевернуть строку. Вы можете сделать это с S[strcspn(S, "\n")] = '\0';
перед вычислением str_len
,
Вот упрощенная версия с использованием scanf()
Обращает отдельные слова:
#include <stdio.h>
int main(void) {
int num_tc, tc, len, left, right;
char buf[31];
if (scanf("%d\n", &num_tc) != 1)
return 1;
for (tc = 0; tc < num_tc; tc++) {
if (scanf("%30s", buf) != 1)
break;
/* Compute the string length */
for (len = 0; buf[len] != '\0'; len++)
continue;
/* Reverse string in buf */
for (left = 0, right = len - 1; left < right; left++, right--) {
buf[left] ^= buf[right];
buf[right] ^= buf[left];
buf[left] ^= buf[right];
}
puts(buf);
}
return 0;
}