因此,我刚刚创建了自己的toupper
(大写一个字符)和strupr
(大写一个字符串)。但这是行不通的。所以,这是代码。
#include <stdio.h>
int toupper(const int character) {
if (character >= 97 && character <= 122)
return (character - 32);
return character;
}
char *strupr(const char *string) {
char *result;
for (int a = 0; a < strlen(string); a++) {
*(result + a) = toupper(*(string + a));
}
return result;
}
int main() {
char myString[6] = "Hello";
printf("myString (Before): \"%s\"\n", myString);
printf("myString (After): \"%s\"\n", strupr(myString));
return 0;
}
这是输出:
myString (Before): "Hello"
程序停止后,它仅打印出第一行。所以我需要帮助修复我的代码。
答案 0 :(得分:1)
您正在尝试访问未初始化的指针结果。这会导致行为不确定:
char * result;
for(int a=0; a<strlen(string); a++)
{
*result[a] = toupper(string[a]);
}
在访问之前,您需要为该阵列分配足够的内存:
char toupper(const char character)
{
if(character >= 'a' && character <= 'z')
return (character + ('A' - 'a'));
return character;
}
void strupr(const char *string, char *result)
{
for(int a = 0; a < strlen(string); a++)
*(result + a) = toupper(*(string + a));
}
int main()
{
char myString[6] = "Hello", res[6] = {};
printf("myString (Before): \"%s\"\n", myString);
strupr(myString, res);
printf("myString (After): \"%s\"\n", res);
return 0;
}
或者您可以使用 strupr 的另一个变体,它会更改输入字符串本身:
char* strupr2(char *string)
{
for(int a = 0; a < strlen(string); a++)
string[a] = toupper(string[a]);
return string;
}
int main()
{
char myString[6] = "Hello", res[6] = {};
printf("myString (Before): \"%s\"\n", myString);
printf("myString (After): \"%s\"\n", strupr2(myString));
return 0;
}
答案 1 :(得分:1)
您尚未为结果分配内存:
char * result;
for(int a=0; a<strlen(string); a++)
{
*(result+a) = toupper(*(string+a));
}
return result;
因此,当您尝试对其进行写操作时,将调用未定义行为。
一个简单的解决方法是在主函数中为结果创建一个固定大小的数组,然后将其传递给函数。
另一种方法是为结果动态分配内存,如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int toupper(const int character)
{
if(character >= 97 && character <= 122)
return (character - 32);
return character;
}
char * strupr(const char * string)
{
char * result = malloc( sizeof(char) * (strlen(string) + 1) );
if(!result) {
printf("Malloc failed!\n");
return "";
}
for(unsigned int a=0; a<strlen(string); a++)
{
*(result+a) = toupper(*(string+a));
}
return result;
}
int main()
{
char myString[6] = "Hello";
printf("myString (Before): \"%s\"\n", myString);
char* res = strupr(myString);
printf("myString (After): \"%s\"\n", res);
free(res);
return 0;
}
但是,如果您采用这种方法,请不要不要忘记释放内存,因为当您不再需要它时(因为此处的其他答案都忘记了释放内存,从而导致内存泄漏) )。
不是错误的原因,但是上层功能的魔幻数字是什么?我建议将它们更改为字符本身(而不是ASCII代码),如下所示:
if(character >= 'a' && character <= 'z')
return (character - ' ');
答案 2 :(得分:0)
这有效:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char * strupr(const char * string)
{
int a;
char * result = malloc(strlen(string) + 1);
for(a=0; a<strlen(string); a++)
{
*(result+a) = toupper(*(string+a));
}
result[a] = '\0';
return result;
}
int main(void)
{
char myString[6] = "Hello";
char *myStringInCaps;
myStringInCaps = strupr(myString);
printf("myString (Before): \"%s\"\n", myString);
printf("myString (After): \"%s\"\n", myStringInCaps);
free(myStringInCaps);
return 0;
}
malloc
在堆上分配空间。即使strupr
函数返回后,该空间中的位仍保持放置状态。另请注意,\0
已添加到字符串的末尾。
理想情况下,应将所有* alloc
ed空间都free
d,否则可能会导致内存泄漏。但是,在这样的玩具程序中,分配的内存可在程序退出后由OS使用(但永远不要认为这是理所当然的)。