2015-01-26 3 views
-4

main.cppToUpper ToLower не работает, помогает то, что случилось с моим кодом

#include <iostream> 
#include "Module2.h" 

int main() 
{ 
std::cout<<"This is a test of Module2.h"<<std::endl; 
std::cout<<UCase("This is a test of UCase")<<std::endl; 
std::cout<<LCase("This is a test of LCase")<<std::endl; 
system("pause"); 
return 0; 

} 

Module2.h

#include <iostream> 
#include "Module2.h" 

int main() 
{ 
std::cout<<"This is a test of Module2.h"<<std::endl; 
std::cout<<UCase("This is a test of UCase")<<std::endl; 
std::cout<<LCase("This is a test of LCase")<<std::endl; 
system("pause"); 
return 0; 

} 

Module2.cpp

/////////////////////////////////////////////////// 
//Module : Module2.cpp 
// 
//Purpose : Shows the usage of modular functions 
/////////////////////////////////////////////////// 

#include "Module2.h" 

/////////////////////////////////////////////////// 
//UCase() 

char *UCase(char *str) 
{ 
//convert each char in the string to uppercase 
// 
int len = strlen(str); 
for (int i ; i < len ; i++) 
{ 
    std::cout<<"In UCase"<<std::endl; 
    str[i]=toupper(str[i]); 
} 

return str; 
} 

/////////////////////////////////////////////////// 
//LCase() 

char *LCase(char *str) 
{ 
//convert each char in the string to uppercase 
// 
int len = strlen(str); 
for (int i ; i < len ; i++) 
{ 
    std::cout<<"In LCase"<<std::endl; 
    str[i]=tolower(str[i]); 
} 
return str; 
} 

Когда я запускаю его там никаких предупреждений или ошибок. Но это не верхняя и нижняя строка. Я думал, что мои петли ошибочны, но это кажется правильным. Что не так с моим кодом.

+2

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

+0

Вы уверены, что ваш «Module2.h» действительно то, что вы разместили, идентично «main.cpp»? – Deduplicator

+1

У вас есть две основные функции(). Разрешается только одно: здесь должна запускаться программа –

ответ

2

Основная проблема заключается в том, что вы пытаетесь изменить строковые литералы, такие как "This is a test of UCase". Это undefined поведение. Вам нужно скопировать литералы в массив char, который вы можете изменить.

Также обратите внимание, что привязка char* к строковому литералу устарела и запрещена по уважительной причине. Это должно излучаемый предупреждение:

UCase("This is a test of UCase") // not good: binding char* to literal 

Есть и другие проблемы с вашим кодом: Неопределенное поведение (UB) в циклах с неинициализированными переменными,

for (int i ; i < len ; i++) // using uninitialized i: UB 

Вы также должны взглянуть на toupper и tolower документации. Они оба принимают int с некоторыми ограничениями на их значения. Вы должны убедиться, что не передаете значение, которое вызывает неопределенное поведение, имея в виду, что можно подписаться на char. Смотрите, например Do I need to cast to unsigned char before calling toupper?

+0

И вообще, 'tolower' и' toupper' не подходят для изменения фрейма. Только почти, в некоторых местах. – Deduplicator

+0

И его петли ошибочны, и он должен наложить на 'unsigned char' ... –

+1

@BaummitAugen Я добавил кое-что о других проблемах в коде. Не уверен, что стоит потратить время на это дерьмо. – juanchopanza

1

Loops вроде этого имеют неопределенное поведение:

for (int i ; i < len ; i++) 

Причина заключается в том, что вы не начали i при значении 0.
Вы не представляете, какое значение стоит i!
Это может быть -10, может быть 824.

Если вы хотите значение для инициализации, вам должны инициализировать его.
я предлагаю:

for (int i=0; i < len; i++) 
+0

Я пробовал это, он не работает – goInDoor

+0

для (int i = 0; i goInDoor

+2

@goInDoor Идея заключается в том, что вы исправляете * все ошибки *. – juanchopanza

0
char *UCase(char *str) 
{ 
char ch; 
int i=0; 

while(str[i]) 
{ 
    ch=str[i]; 
    putchar(toupper(ch)); 
//putchar : The value is internally converted to an unsigned char when written. 
    i++; 
} 
} 

/////////////////////////////////////////////////// 
//LCase() 

char *LCase(char *str) 
{ 
char ch; 
int i=0; 

while(str[i]) 
{ 
    ch=str[i]; 
    putchar(tolower(ch)); 
    i++; 
} 
} 

я, наконец, пишу это. Хотя, я до сих пор не совсем понимаю, но я узнал

#include <ctype.h> 
int tolower(int ch); 

означает ToLower ToUpper может изменить только один символ каждый раз, так что я не могу

tolower ("This is a test of LCase"); 

код, как это.