2017-02-20 30 views
0

я стартер и я написал код:добавить заявление перерыва в цикле в то время как с GetChar

#include<stdio.h> 
char c; 
char a[100]={0}; 
int i; 

int main(void) 
{ 
    while(1) 
    { 
    i=0; 
    while(1){ 
     if((c=getchar())!='\n'){ 
     a[i]=c; 
     i++; 
     } else { 
     break; 
     } 
    } 
    printf("%s\n",a); 
    } 
    return 0; 
} 

и теперь у меня есть идея, что я хочу, чтобы добавить заявление перерыва, что, когда я тип д, программа сломает. так что моя новая программа:

#include<stdio.h> 
char c; 
char a[100]={0}; 
int i; 

int main(void) 
{ 
    while(1) 
    { 
    i=0; 
    while(1){ 
     if((c=getchar())!='\n'){ 
     a[i]=c; 
     i++; 
     } else { 
     break; 
     } 
    } 
    printf("%s\n",a); 
    if(getchar()=='q')break;  /*i added this*/ 
    } 
    return 0; 
} 

я знаю, потому что GetChar() конфликт код не является правильным, как я могу сделать, чтобы добавить команду типа д перерыв. большое спасибо.

+0

Начните с изучения того, как избежать использования 'глобальных переменных', когда не нужно –

+0

@SeekAddo Что вы имеете в виду * global *? Эти переменные имеют внутреннюю связь, поэтому они не видны другим модулям ... Не могли бы вы показать мне, где в [стандарте C] (http://www.iso-9899.info/n1570.html) я могу найти Дополнительная информация о * глобальных переменных *? Я хотел бы узнать, как объявлять и использовать их ... – Sebivor

+0

@Seb Глобальные переменные могут быть доступны из любой точки приложения. Некоторыми они могут считаться плохой практикой, поскольку переменные могут быть изменены другой функцией. 'char c; '' char a [100] = {0}; '' int i; 'были определены вне' main'. Любая функция внутри этого приложения может получить к ним доступ, для которой существует плохая практика. –

ответ

0

Попробуйте этот код:

#include <stdio.h> 
#include <stdlib.h> 

#define q 113 --> These values are coming from ASCII table. 
#define Q 81 

int main(void) 
{ 
    char ch = 0; 
    do 
    { 
     ch = getchar(); 
     switch(ch) 
     { 
      case q: 
       // your logic goes here 
       exit(0); 
      case Q: 
       // your logic goes here 
       exit(0); 
      /* more cases can come here */ 
     } 
    } 
    while(1); 
} 
+0

Спасибо Сорен, исправлено. Кроме того, вместо 'exit()', мы все равно можем использовать 'break', если есть какой-то exit_flag или условие внешнего переключателя. –

1

Вряд ли быть то, что вы на самом деле хотите, но, по крайней мере, это будет работать

#include<stdio.h> 

int main(void) 
{ 
    char a[100]={0}; 
    int i = 0; 
    do { 
    int c = getchar(); 
    switch (c) { 
     case EOF: 
      /*EOF*/ 
      return -1; 
     case '\n': 
      a[i] = 0; 
      printf("%s\n",a); 
      i= 0; 
      break; 
     default: 
      a[i++] =c; 
      break; 
    } while (c != 'q' || i > 1); 
    return 0; 
} 
+0

Вы уверены, что 'EOF' гарантированно будет -1? Зачем вводить магическое число, а не просто писать 'EOF'? – Sebivor

+0

Я использовал -1, чтобы проиллюстрировать, что 'c' не может быть типа char, но я уверен, что мог бы написать более длинное объяснение - и да, в то время как EOF обычно равен -1, тогда [это только гарантировано будет отрицательным номер] (http://stackoverflow.com/a/4706217/668501) – Soren

+0

Это было бы лучше проиллюстрировано с помощью 'unsigned char a [100] = {0};' ... – Sebivor

1

я стартер и я написал код

О, о! Здесь идет ... Во-первых, шансы на успешное изучение портативного стандартного языка программирования C - это подавляюще низкий для тех, кто пытается учиться неуправляемой проб и ошибок. Есть действительно хорошо книга, которую вы можете использовать в качестве руководства, но вам нужно читать И делать упражнения, как вы спотыкаетесь через них. Это K & R2E, если вам интересно.


Все напоминающее char c; c = getchar(); является ошибочным, так как сужающее преобразование из int (которого getchar возвращается) ошибка char Отбрасывает обработку информации.

Все символьные значения, возвращаемые getchar будет как unsigned char значения преобразуются в int, так что было бы технически быть правильнее (хотя еще неверны), чтобы использовать этот тип.

Значения ошибок возвращаются как отрицательное целое число, такое как EOF, чтобы их не путали с символьными значениями, что именно то, что ваш код делает неправильно, отбрасывая информацию об ошибке.

getchar возвращает int, поэтому хранить значение в int, а затем проверить на наличие ошибок, затем, если вы должны, преобразующие его вниз к unsigned char.


и теперь у меня есть идея, что я хочу, чтобы добавить заявление перерыв, что, когда я типа д, программа сломается.

Исходя из предыдущего обсуждения, такое требование является излишним, тем не менее, легко включить , если вы правильно обработки ошибок.Просто добавьте дополнительный тест, чтобы он соответствовал q в обработке ошибок, и престо!

Тем не менее, обработка, скорее всего, уже ошибка решает эту проблему, так как большинство операционки имеет механизм для близко stdin, что вызвало бы getchar вернуть EOF, тем самым вызывая ошибку обработки положения. Обычно это достигается нажатием CTRL + d в Linux или CTRL + z в Windows.


В заключение, если вы еще не читаете, кажется, что хорошая книга о C - это не все, что принесет вам пользу; хорошая книга о консольных скриптах для ваших любимых Unix-подобных ОС также будет очень полезна.