2013-09-23 4 views
-1

Я делаю программу, которая отбрасывает письмо из списка, если вы введете письмо, может кто-нибудь мне помочь. Благодарю.Ввод буквы, а затем минус на алфавит

в примере: (ДО)

АБВГДЕЖЗИКЛМНОПРСТУФХЧШЭЮЯ ввести букву: A

(после ввода буквы 'А')

_BCDEFGHIJKLMNOPQRSTUVWXYZ ввести букву:

#include <stdio.h> 
    #include <string.h> 
    #include <conio.h> 
    #include <windows.h> 

int main() 
{ 
    int alphabet[26]; 
    char letter; 
    int i; 
    int j; 

    alphabet[0] = 'A'; 
    for(i = 0;i < 26; i++) 
    { 
     alphabet[i] = alphabet[0]; 
     printf ("%c", alphabet[i], alphabet[i]); 
     alphabet[0]++; 
    } 

     printf("\n\nenter the letter you want to remove in the alphabet: "); 
     scanf("%c", letter); 

     while(j<alphabet[i]) 
     { 
      if(letter==alphabet[i]) 
      { 
       j--; 
      } 
     } 
} 

Проблема заключается в том, что он не удаляет букву в алфавите wh ru я ввел письмо, которое хочу удалить. пожалуйста помоги. Благодарю.

EDIT: одна последняя вещь, как я могу сделать только один вход ?, я имею в виду, если я ввешу ту же букву во второй раз, она скажет: «Вы уже ввели эту букву».

+0

Какой вопрос? Что не работает в вашей программе? –

+0

@ Étienne жаль, что я забыл вопрос, вопрос в том, что он не удаляет букву в алфавите, когда я ввожу букву, которую хочу удалить. – user2803376

+0

вместо того, чтобы писать символы в ваш массив, вы могли бы просто написать целочисленное число символа, и если вы распечатаете его, вы переведете его на символ (в этом минимальном примере он не принесет большой производительности, но может оказаться полезным в других задачи;)), потому что компьютер в порядке с int;) – Martin

ответ

1

Вы считаете, что буквы являются contiguos, как в ASCII, но вы не можете предположить, что в C.

Следующая строка имеет дублированную аргумент:

printf ("%c", alphabet[i], alphabet[i]); 

падения последнего alphabet[i].

Ваше последнее if() предложение неверно: сравнение должно быть выполнено с помощью ==.

Непонятно, что вы хотите сделать.

EDIT:

Я хотел бы сделать программу таким образом:

#include <stdio.h> 

int main() 
{ 
    char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 

    char letter; 

    printf("Choose a letter: "); 
    letter = getchar(); 

    printf("\n\n"); 

    for(int i = 0; i < 26; i++) 
     if (letter == alphabet[i]) 
     { 
      alphabet[i] = '_'; 
      break; /* This terminates the for() loop */ 
     }   

    printf("Result: %s \n", alphabet); 
} 

EDIT2: Я изменил декларацию alphabet, потому что символьная константа должна быть изменена позже ...

+0

Сэр, я хочу сделать это, когда я введу письмо, оно удалит введенную букву в алфавите. извините im not that pro в программировании. – user2803376

+0

Хорошо, но ваш последний сравнительный тест неправильный, потому что он всегда «истинный». Вы выполняете задание, а не сравниваете его. Измените '=' на '=='. – pablo1977

+0

Я уже меняю его. так как я могу удалить письмо в алфавите после ввода буквы, которую хочу удалить? – user2803376

1

вы назначая значение для letter с заявлением

letter=alphabet[i] 

Этот оператор всегда будет правдой, если только alphabet[i] не является 0.

использование Comparision вместо

letter==alphabet[i] 

также ваш while петля немного странно, так как значение j будет определено в начале, так что ваш Comparision будет неопределенным.

while(j<alphabet[i]) 
    { 
     if(letter=alphabet[i]) 
     { 
      j--; 
     } 

вероятно вы просто хотите сделать что-то вроде:

for(i = 0;i < 26; i++) { 
     if(alphabeth[i]==letter) { 
      alphabeth[i]='_'; 
     } 
    } 

, если вы хотите, чтобы заменить первое вхождение буквы, вставьте break; после alphabeth[i]='_';

и вы, вероятно, не» t хотите иметь магические значения типа «26», возникающие несколько раз в исходном коде.

вместо этого использовать что-то вроде

#define ALPHABETSIZE 26 

и заменить все вхождения 26 по ALPHABETSIZE

+0

Я уже меняю его, но его не удаляет буква, введенная мной из алфавита. – user2803376

0

Если я вас правильно, вы хотите пройти через массив и проверить, если введенный символ соответствует любому в массиве ,

Есть ли причина, почему вы не используете такой цикл for и устанавливаете позицию массива в 0 вместо инструкции while?

for(i=0;i<26;i++) 
{ 
    if(letter == alphabet[i]) 
     alphabet[i] = "_"; // or setting it to 0 if you use and int-array 
} 

Или я могу получить что-то неправильно здесь?

+1

Выполнение 'alphabet [i] = 0' нарушит распечатку .. например. если пользователь ввел 'C', следующий распечаток будет печатать только * AB * –

+0

@ umläute ... да, конечно, он не указал, что я связал это с моим утверждением в комментарии, чтобы вместо него использовать целые числа из chars ... я редактирую это в своем посте, спасибо – Martin

+0

yup :), когда он соответствует букве с алфавита, он будет заменен на _ и не может быть введен снова. – user2803376

0

Есть несколько вещей, которые вы делаете, чтобы сделать это тяжело для себя.

Вы должны использовать «==» не «=», чтобы сравнить две переменные

Ваше значение «J» не инициализирован так «j--» будет определено

его, вероятно, лучше, чтобы сохраняйте все свои типы одинаковыми и сделайте массив массивом «char» не массивом «int».

Удалить элемент из массива «int alphabet [26];» было бы очень сложно, возможно, было бы легче сделать это «струнным» упражнением. Все, что вы действительно можете сделать, это сделать «пустое» письмо по

alphabet[j] = ' '; 

Я думаю, что его можно сделать лучше дизайн, хотя если вы объяснить ваши требования более четко :)

+0

если сделать это так: 'char alphabet [27] = {'a' - 'z'}', то как я могу удалить букву i, введенную в алфавит? – user2803376

+1

Вы не можете удалить его, это массив фиксированного размера, вы не можете изменить его размер, вы можете поместить только другой символ вместо буквы, которую хотите удалить. так, например, при использовании {'a', 'b', 'c'} вы не можете удалить 'b', поэтому у вас есть {'a', 'c'} (для этого вы должны использовать списки, а не массивы), но вы можете '' вместо 'b' и получить {'a', '', 'c'} и обработать пробелы как удаленные элементы. – zoska

+0

точно (+1) ... возможно, что вы хотите сделать, это сделать «string» с «abc .... xyz» в нем, а затем использовать это, чтобы создать новую строку (скажем, удалить «a») Ьс ... хуг». Это будет сильно отличаться от вашего решения, но не так сложно. Вам нужно будет выделить и освободить память, чтобы делать такие вещи ... (искать вещи, такие как strcpy и strcat) –

Смежные вопросы