strupr();我不做的工作

时间:2010-07-02 16:01:47

标签: c

我制作了一个程序,将小写字符串转换为大写字母,如strupr();在strings.h ..当我运行程序时打印一些ascii代码

#include<stdio.h>
#include<conio.h>

void xstrupr(char string[]);

void main(void)
{
    char string[40];
    puts("Enter string:");
    gets(string);
    xstrupr(string);
    printf(" %s ",string);
    getch();
}

void xstrupr(char string[])
{
    int i;
    for(i=0;;i++)
    {
        if ((string[i]>='a')&&(string[i]<='z') )
            string[i]+=64;
        else
            if(string[i]=='\0')
                break;
    }
}

7 个答案:

答案 0 :(得分:8)

如果你不介意我这么说,这太可怕了。当然不要亲自接受这个。

  • 不要依赖ASCII值,也不要将实际字符值硬编码为文字数字。
  • 不要将char变量用作循环索引;它们通常太小了。
  • 使用islower()检查字符是否为小写。
  • 使用toupper()将其转换为大写字母。
  • 意识到像这样的代码不适用于大多数语言
  • 使用宽字符也不够;某些语言的单词在从小写到高位时会改变长度(字符数)。

我建议的这种风格的实现方式是:

#include <ctype.h>

void xstrup(char *string)
{
  for(; *string; string++)
    *string = toupper((unsigned char) *string);
}

请注意,这只是一个合理的(在我看来)实现它想要实现的目标,它绝不是完美的,也不能解决我的所有抱怨。

答案 1 :(得分:2)

您正在返回一个整数(0或i-64)并将其视为指向空终止字符串的指针。打印垃圾我并不感到惊讶。

答案 2 :(得分:2)

实际上在ASCII图表范围内如下:

  • A到Z :65到90
  • a到z :97到122

您编辑的程序就是这样:

#include<stdio.h>
#include<conio.h>

void xstrupr(char string[]);

void main(void)
{
    char string[40];
    puts("Enter string:");
    gets(string);
    xstrupr(string);
    printf(" %s ",string);
    getch();
}

void xstrupr(char string[])
{
    int i;
    for(i=0;;i++)
    {
    if ((string[i]>='a')&&(string[i]<='z') )
        string[i]-=32;
    else
        if(string[i]=='\0')
        break;
    }
}

请参阅下面的ascii表:

ASCII Table http://www.unitechnical.info/Products/ASCII-Chart.jpg


来源:

图片来自http://www.unitechnical.info/

答案 3 :(得分:1)

当遇到小写字符时,该函数退出,而不是取代当前字符。

strupr()返回的类型也是错误的,它不应该是char。并且它不会返回正确的东西。所以它肯定会输出垃圾。

[我不会给你所有细节,因为你似乎是学习,随时可以要求更多]。

答案 4 :(得分:1)

首先,大写和小写字母之间的ASCII值差异为32,而不是64。

其次,最重要的是,C库提供了tolower()和toupper()函数,这些函数不仅适用于ASCII,而且适用于您当前使用的任何编码。

答案 5 :(得分:1)

在我看来,你正试图在最基本的层面上做到这一点。话虽如此,你做出了一个错误的假设。

您不会通过向其添加64来获得字母的大写版本。此外,仅提供幻数不清楚,并且在另一个字符集上可能是错误的。

尝试将string[i] += 64;更改为string[i] += 'A' - 'a';。这将适用于所有字符集,其中大写和小写字母之间存在恒定的差异。

现在,在某些情况下会失败。例如,在EBCDIC中,字母不是连续的,因此从“a”到“z”的范围不是全部字母。这就是为什么在实际代码中,您使用isalpha()toupper()等标准功能,但这可以作为练习。

答案 6 :(得分:0)

  1. 首先,您的函数返回char。这是无关紧要的。
  2. return会从函数中断,而不是替换字符。
  3. 这是完全错误的。 Upr不能按字符进行。例。德国eszett'ß'的升级是两个角色,又名“SS”。假设您的char *输入不包含utf-8是“文本犯罪”。