2016-02-01 14 views
1

Я выполнял задание для своего класса C в школе, и я ударил немного.Необработанное исключение: нарушение доступа к чтению

#include <stdio.h> 

char stringToUpper(char * sName) 
{ 
    while(*sName != '\0') 
    { 
     stringToUpper (* sName); 
     ++* sName; 
    } 
} 

int main() 
{ 
    char str[50]; 
    char * sName; 
    printf("Please enter your name "); 
    scanf("%s", str); 
    printf("Hello %s ", str); 
    sName = str; 
    stringToUpper(sName); 
    printf("Name in uppercase: %s ", sName); 
} 

Я пытался искать другие решения уже, однако я обнаружил, что все остальные проблемы были намного более продвинутыми, чем уровень я на самом деле и просто не мог следовать за ним. Я все еще немного разбираюсь в работе с указателями и все еще немного смущен тем, как они работают (всего несколько недель в классе), поэтому я чувствую, что проблема связана с этим. Я почти уверен, что проблема имеет какое-то отношение к заявлению while.

Это ошибка, я получаю:

Необработанное исключение брошено: чтение нарушение прав доступа.

sName был 0x41.

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

Спасибо за помощь, которую я получаю.

+0

Похоже, вы переполнением буфера 50 байт (что вы входя?). Также '++ * sName;' увеличивает байт, на который указывает 'sName', а не указатель, как вы ожидаете. –

+0

Что должен делать' stringToUpper'? –

+0

'++ * sName;' возможно, вы имели в виду '++ sName;' –

ответ

1

Ваша stringToUpper функции имеют некоторые проблемы:

while(*sName != '\0') 
{ 
    stringToUpper (* sName); 
    ++* sName; 
} 
  • Вы можете называть toupper изменить в верхний регистр и присвоение значения обратно *sName вместо того, чтобы функция называть себя. Фактически, ваш звонок неверен, потому что вы передаете char функции, ожидающей char *. На следующей итерации stringToUpper он пытается разыменовать неверный указатель, который вызывает сбой.
  • Вы должны приращать sName (что указывает на текущий символ), а не *sName.

Исправленная версия:

while(*sName != '\0') 
{ 
    *sName=toupper(*sName); 
    ++sName; 
} 
+0

СПАСИБО Ваше решение - это то, что я пытался сделать в первую очередь. Я честно понятия не имею, как я не поймал, что я вызывал функцию вместо toupper. Это было действительно глупо, спасибо снова – zman419

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