2013-09-07 2 views
-2

Моя программа: Что-то не такПочему моя программа возвращает символы, которые я не вводил? (Pure C)

#define _CRT_SECURE_NO_WARNINGS 
#include <ctype.h> 
#include <stdio.h> 
//Функция для проверки соответствия символов. 
int ifSignsCorrect(char theChar) { 
    if ((theChar >= 'A' && theChar <= 'Z') || (theChar >= 'a' && theChar <= 'z') || theChar == '.' || theChar == ' ' || theChar == '*') return 1; 
    return 0; 
} 

int main() { 
    char string[256]; 
    int i = 0; 
    //Заполняем массив 
    for (i = 0; i < 256; i++) { 


     scanf("%c\n", &string[i]); 
     if (string[i] == '*') break; 
     printf("%с\n", string[i]); 
     if (ifSignsCorrect(string[i]) != 1) { 
      printf("You used wrong characer, formating disc C (Just joking)\n"); 
      return; 
     } 

    } 


} 
+0

Когда 'i == 0', что вернет это выражение' string [i-1]! = '*' '? –

+1

* Что-то не так * .... что, собственно, неправильно, как только вы исправили приведенные ошибки? (ПРИМЕЧАНИЕ: 'scanf' вернется после того, как пользователь нажмет ENTER ('\ n') - знаете ли вы, что происходит в вашей программе при достижении ENTER?) – lurker

+0

ах теперь я понимаю. – user2757588

ответ

1

Три вещи, которые я хотел бы упомянуть:

Первого:

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

int i = 0; 
while (string[i - 1] != '*') { 

На первой итерации вы получите доступ к string[-1]. Вы должны решить это первым.

Второе:

Вы определяете массив указателей в этой строке:

char *string[256]; 

использовать массив символов char string[256]; вместо.

Третье:

Вы можете просто напечатать, как это:

printf("You used wrong characer, formating disc C (Just joking)\n"); 

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

Надеюсь, это поможет.

+1

Спасибо, я исправлю проблемы. – user2757588

1

Вы использовали массив указателей вместо массива символов здесь:

char *string[256]; 

Вы также доступ массива из границ здесь:

while (string[i - 1] != '*') { // here i == -1 

Также, если заявление после зсапа (), как это было бы правильно:

if(string[i] == '*') 
    break ; 

EDIT:

Почему программа печатает только символ ?? Поскольку характер c в линии printf("%с\n", string[i]); на самом деле не является ASCii c

Попробуйте скопировать его в программе, которая поддерживает только ASCII. Я скопировал его в блокнот ++ и установил кодировку в ascii, и он превратился в ? :). Должна быть многоязыковая ошибка поддержки, поскольку я вижу, что у вас включен кириллица.

+0

Я удалил *, но это не устранило проблему. – user2757588

+0

Да, я сделал это. Но я все еще не могу понять, почему он возвращает ё для каждой буквы i. – user2757588

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