#c
#c
Вопрос:
Я пытаюсь напечатать символы данной строки в четных и нечетных позициях с помощью программы на c. Моя программа работает нормально, если есть только одна строка, но она не работает для предложения, содержащего более одной строки.Следующий код печатает только вторую введенную строку, но он не печатает символы в четных и нечетных позициях, как это было сделано для самой первой строки.
int main()
{
char string[10], even[10], odd[10], i, j, k,count;
i = j = k = count = 0;
do
{
printf("Enter your input string:");
fgets(string, 10, stdin);
string[strlen(string) - 1] = '';
/* printing the input string */
printf("Given Input string:%sn", string);
while (string[i] != '')
{
if (i % 2 == 0) {
odd[j ] = string[i];
}
else {
even[k ] = string[i];
}
i ;
}
/* terminating even and odd string with NULL */
odd[j] = even[k] = '';
/* print the characters at odd position and even positions */
printf(" %s %s", odd,even);
odd[0]=even[0]='';
count ;
}while(count<2);
return 0;
}
При выполнении, когда я ввел первую строку как «united», она напечатала «uie» для нечетной позиции и «ntd» для четной позиции. Затем мне предлагается ввести вторую строку, которую я ввел как «состояния», но ничего не распечатывается, кроме введенной строки, и программа завершается. Вывод не был таким, как для первой строки.
Пожалуйста, помогите мне указать на мою ошибку, чтобы мой код работал корректно для любого количества строк, а не только для первой строки, т. Е. Он должен выводить символы в четных и нечетных позициях для всех строк, введенных пользователем.
Комментарии:
1. Вы забыли сбросить локальные переменные.
2.
i
,j
, иk
не сбрасываются на 0.3. Да, теперь я понял свою ошибку. Я исправил, и теперь он работает. Большое вам спасибо!
4. Правильно отформатируйте / сделайте отступ в вашем коде.
5.
string[strlen(string) - 1] = '';
Это то, что некоторые люди называют программированием культа карго . Можете ли вы объяснить в мельчайших деталях, что делает эта строка?
Ответ №1:
Вы ограничиваете себя архаичной версией синтаксиса C, которая требовала, чтобы все локальные переменные объявлялись в верхней части блока, перед любыми исполняемыми операторами.
Поскольку ваш код не использует переменные, кроме как count
вне do
цикла/ while
, вам следует переместить их объявления внутри цикла. Это гарантирует, что переменные будут иметь соответствующие начальные значения в начале каждой итерации.
Вот несколько дополнительных моментов, которые следует иметь в виду:
- Ваш код приведет к неопределенному поведению, если конечный пользователь завершит поток ввода (Ctrl Z в Windows, Ctrl D в UNIX) без ввода каких-либо символов
- Ваш код удалит последний символ, когда конечный пользователь завершит поток ввода после ввода менее десяти символов
odd[0]=even[0]=''
не требуется
Комментарии:
1. Спасибо за ваши ценные предложения.
Ответ №2:
использование пространства имен std;
struct str
{
char s[10000];
};
int main() {
int T;
cin >> T;
fflush(stdin);
str s1[10];
while (T--) {
cin >> s1[T].s;
fflush(stdin);
int j = 0;
while (j < strlen(s1[T].s)) {
if (j % 2 == 0)
cout << s1[T].s[j];
j;
}
cout << " ";
int k = 0;
while (k < strlen(s1[T].s)) {
if (k % 2 == 1)
cout << s1[T].s[k];
k;
}
cout << endl;
}
return 0;
}