C 创建我自己的strupr函数,但它';它不工作了
所以我刚刚创建了自己的C 创建我自己的strupr函数,但它';它不工作了,c,string,function,C,String,Function,所以我刚刚创建了自己的toupper(将单个字符大写)和strupr(将字符串大写)。但它不起作用。下面是代码 #include <stdio.h> int toupper(const int character) { if (character >= 97 && character <= 122) return (character - 32); return character; } char *strupr(con
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;
}
它只是打印出第一行,然后程序停止。因此,我需要帮助修复代码。您正在尝试访问未初始化的指针结果。这会导致不确定的行为:
char * result;
for(int a=0; a<strlen(string); a++)
{
*result[a] = toupper(string[a]);
}
char*结果;
对于(int a=0;a='a'&&character您尚未为结果分配内存:
char * result;
for(int a=0; a<strlen(string); a++)
{
*(result+a) = toupper(*(string+a));
}
return result;
char*结果;
对于(int a=0;a=97&&character而言,此操作有效:
#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;
}
#包括
#包括
#包括
字符*字符串(常量字符*字符串)
{
INTA;
char*result=malloc(strlen(string)+1);
对于(a=0;a建议:使用'a'
、'z'
和'
,而不是97、122和32。这更便于携带,通常更易于阅读,因为现在人们不必记住ascii表。如果分配允许,请省去麻烦,使用库的内置touper
功能。如果不允许,请参阅关于使用isalpha
并不是所有的字符编码都能很好地组织成连续的块。@user4581301不是'
,而是'a'-'a'
。虽然这也不能移植到EBCDIC…但是*(result+a)=toupper(*(string+a))中的result
的值是多少
?@Lundin反唇相讥地证明了我的观点。我在一行中看到了3个可识别的数字,并误解了第三个数字的上下文。建议编辑以提醒提问者,malloc
ed也应该是免费的
,因为现在你要做的就是创建一个内存泄漏!:/There。注意分配的内存。string[a]=toupper(string[a]);string[a]@chux时string[a]<0
,toupper只返回string[a]
,不做任何更改。UB在哪里?“touper只返回string[a],不做任何更改。”-->可能是在您的计算机/编译器上,但C并没有这样定义toupper(intC)
“在所有情况下,参数都是int
,其值应表示为无符号字符
,或应等于宏EOF
的值。如果参数有任何其他值,则行为未定义。”。因此,负值会导致行为未定义(UB)。
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;
}
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;
}
if(character >= 'a' && character <= 'z')
return (character - ' ');
#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;
}