Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.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
将char*字符串转换为大写_C_String_Char - Fatal编程技术网

将char*字符串转换为大写

将char*字符串转换为大写,c,string,char,C,String,Char,下面的代码应该返回源代码的大写字符串。 它可以工作,但不能转换字符串。不知道出了什么问题 char *StrUpper (char *s) { int i = 0; char *t = &s [i]; while (*t) { if ((*t > 0x5a) && (*t < 0x7b)) t = (t - 32); t = &s [i++]; } return (s); } i

下面的代码应该返回源代码的大写字符串。 它可以工作,但不能转换字符串。不知道出了什么问题

char *StrUpper (char *s) {
    int i = 0;
    char *t = &s [i];
    while (*t) {
        if ((*t > 0x5a) && (*t < 0x7b)) t = (t - 32);
        t = &s [i++];
    }
    return (s);
}

int main () {
    printf ("%s\n", StrUpper ("lower case string"));
    return (0);
}
char*StrUpper(char*s){
int i=0;
char*t=&s[i];
while(*t){
如果(*t>0x5a)和(*t<0x7b))t=(t-32);
t=&s[i++];
}
申报表;
}
int main(){
printf(“%s\n”,StrUpper(“小写字符串”);
返回(0);
}

您的代码中有一些问题:

  • 您忘记在分配中取消对字符串的引用:

    t = (t - 32);
    
    应该是

    *t = (*t - 32);
    
    t = &s [++i];
    
  • 您没有检查正确的范围:

    if ((*t > 0x5a) && (*t < 0x7b)) 
    
    应该是

    *t = (*t - 32);
    
    t = &s [++i];
    
    或者干脆

    t++;
    

  • 您的代码中有一些问题:

  • 您忘记在分配中取消对字符串的引用:

    t = (t - 32);
    
    应该是

    *t = (*t - 32);
    
    t = &s [++i];
    
  • 您没有检查正确的范围:

    if ((*t > 0x5a) && (*t < 0x7b)) 
    
    应该是

    *t = (*t - 32);
    
    t = &s [++i];
    
    或者干脆

    t++;
    

  • 字符串文字是指向常量字符数组的常量指针。换句话说,字符串文字是只读的


    试图修改常量数据会导致错误。如果您的程序有未定义的行为,那么它的任何行为都不可信。

    字符串文字是指向常量字符数组的常量指针。换句话说,字符串文字是只读的


    试图修改常量数据会导致错误。如果您的程序有未定义的行为,那么它的任何行为都是不可信的。

    您可能还需要更改

      t = &s[i++];
    


    由于i++首先将当前i值分配给索引,然后执行增量,因此第一次处理同一索引时,您可能会再次处理该索引。

    您可能还需要进行更改

      t = &s[i++];
    


    因为,i++首先将当前i值分配给索引,然后执行增量,所以第一次处理同一索引时会再次处理。

    这两条语句中的第一条

    if ((*t > 0x5a) && (*t < 0x7b)) t = (t - 32);
    t = &s [i++];
    
    更改指针本身。这句话呢

    t = (t - 32);
    
    t = &s [i++];
    
    不会立即更改指针

    此外,还不清楚这些神奇的数字0x5a、0x7b、32是什么意思

    这个函数可以写成

    char * StrUpper ( char *s ) 
    {
        for ( char *p = s; *p; ++p )
        {
            if ( *p >= 'a' && *p <= 'z' ) *p -= 'a' - 'A';
        } 
    
        return s;
    }
    

    考虑到一些编码系统不能保证所有小写字母在没有中间代码的情况下相互跟随。因此,一般来说,这种方法是不正确的。

    首先,这两种说法

    if ((*t > 0x5a) && (*t < 0x7b)) t = (t - 32);
    t = &s [i++];
    
    更改指针本身。这句话呢

    t = (t - 32);
    
    t = &s [i++];
    
    不会立即更改指针

    此外,还不清楚这些神奇的数字0x5a、0x7b、32是什么意思

    这个函数可以写成

    char * StrUpper ( char *s ) 
    {
        for ( char *p = s; *p; ++p )
        {
            if ( *p >= 'a' && *p <= 'z' ) *p -= 'a' - 'A';
        } 
    
        return s;
    }
    


    考虑到一些编码系统不能保证所有小写字母在没有中间代码的情况下相互跟随。因此,一般来说,这种方法是不正确的。

    “它可以工作,但不会转换字符串”-当然这意味着它不工作?还要补充的是,您说它工作的原因是因为您得到了一个未定义的行为。最好提一下,您正在两次查看第0个元素:
    t=&s[i++]
    可能希望被替换为
    t=&s[++i]
    “它工作但不转换字符串”-当然这意味着它不工作?还要补充的是,您说它工作的原因是因为您得到了一个未定义的行为。您可能需要提到,您正在两次查看第0个元素:
    t=&s[i++]
    可能希望被替换为
    t=&s[++i]
    我已经试过了(*t=*t-32);然而,在这种情况下,代码块崩溃如下:问题签名:问题事件名称:APPCRASH。。。异常代码:C0000005我已经试过那个(*t=*t-32)东西了;然而,在这种情况下,代码块崩溃如下:问题签名:问题事件名称:APPCRASH。。。异常代码:C0000005刚刚尝试了上面的代码,代码块崩溃如下:问题事件名称:APPCRASH异常代码:c0000005@merkez3110问题不在于我展示的功能。你怎么称呼它的问题。例如,您不能使用字符串文字作为函数的参数。@@merkez3110请参阅我更新的文章,其中有一个使用函数的示例。刚刚尝试了上面的代码,代码块崩溃如下:问题事件名称:APPCRASH异常代码:c0000005@merkez3110问题不在于我展示的功能。你怎么称呼它的问题。例如,您不能使用字符串文字作为函数的参数。@@merkez3110请参阅我更新的帖子,其中有一个使用函数的示例。我已经尝试了下面的代码,没有任何更改:`int main(){char*s=“lower case string”;printf(“%s\n”,StrUpper(s));return(0);}`@merkez3110这是因为
    s
    仍然指向常量字符串文本。而是做
    chars[]=“…”好<代码>StrUpper(“废话”)
    char*s=“诸如此类”;斯特鲁珀(s),不工作;但是
    chars[]=“诸如此类”;斯特鲁珀(s),工作。谢谢大家。正如@JoachimPileborg所指出的,我试图处理一个字符串文字,它是一个常量,由def定义。奇怪的是,字符串文字不是常量,它们是不可修改的定义。字符串文字是异常的:它们不会变成
    const char
    类型的数组,它们会变成
    char
    类型的数组,但您仍然被禁止修改。我已经尝试了下面的代码,没有任何更改:`int main(){char*s=“lower case String”;printf(“%s\n”,StrUpper(s));return(0);}`@merkez3110这是因为
    s
    仍然指向常量字符串文本。而是做
    chars[]=“…”好<代码>StrUpper(“废话”)
    char*s=“诸如此类”;斯特鲁珀(s),不工作;但是
    chars[]=“诸如此类”;斯特鲁珀(s),工作。谢谢大家。正如@JoachimPileborg所指出的,我试图处理一个字符串文本,它是由def定义的常量