Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 创建我自己的strupr函数,但它';它不工作了_C_String_Function - Fatal编程技术网

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;
}