【问题标题】:I need help understanding character manipulation我需要帮助理解角色操作
【发布时间】:2013-05-10 16:42:35
【问题描述】:

问题:我需要写一个函数,

int is_lower_101(char c), 

如果是小写则返回true,否则返回false。而且我不能使用预定义的tolower 类型函数。我也不能对字符使用整数值。

我需要帮助:我已经有了头文件:

#ifndef CHAR_H
#define CHAR_H

int is_lower_101(char c);

#endif

但是我在执行文件上遇到了问题。我不确定涉及字符的实现文件的一般格式是什么样的。我觉得我必须使用条件,但我只是不确定如何显示 c 是一个小写字符。我会使用 for 循环吗?谢谢。

【问题讨论】:

  • 但是,这不是使用字符的整数值吗?我不能那样做。 :(
  • 如果这是一个作业,我建议询问 é、æ、ñ 和 ü 是否为小写。 (更不用说Ꮉ、Ꮍ、Ꮝ、Ꮞ等)

标签: c character lowercase


【解决方案1】:

如果您不关心支持a 到z 以外的任何字符,那么您可以进行如下比较:

if (c >= 'a' && c <= 'z')

请注意,这是一个非常糟糕的主意,并且会在某人第一次输入简历等时中断。标准功能正是出于这个原因。

【讨论】:

  • 标准函数是不是我在这个作业中不能使用的低级函数?
  • 是的。别忘了问,islower("résumé") 应该返回true 还是false!
  • C 标准不保证只有小写字母的值在'a' 和'z' 之间。
  • @EricPostpischil 非常正确,这就是为什么滚动自己的函数是个坏主意!
【解决方案2】:
int is_lower_101(char c){
    int i;
    for(i=0;i<26;i++){
        if("abcdefghijklmnopqrstuvwxyz"[i] == c)
            return i==i;
    }
    return i!=i;
}

使用 bsearch 版本。

#include <stdlib.h>

int cmp(const void *a, const void *b){
    return *((char*)a) - *((char*)b);
}

int is_lower_101(char c){
    return !!bsearch(&c, "abcdefghijklmnopqrstuvwxyz", 26, sizeof(char), cmp);
}

【讨论】:

  • 如果我不使用 for 循环这样做可以吗?还有一个简单的问题,字符文字是否只是:'a'、'b' 等?
  • @KarenLee 我不明白你的问题的意思。
  • 那么,如果我只使用一个条件语句来执行此操作,是否可以:if (c >= 'a' && c
  • if (c &gt;= 'a' &amp;&amp; c &lt;= 'z') then return true? 是的。但可能存在 az 以外的字符。
  • 如果我的导师只希望我们包含字符 a-z,那么如果我按照我的方式进行操作可以吗?
【解决方案3】:

这是一个独立于字符集编码的实现,但它仅支持只有 26 个小写拉丁字母的语言环境(包括默认的 C 语言环境)。

这里的答案比其他实现占用更多的数据空间,因为它需要一个表,但它应该非常快,只需要几条指令即可对其参数进行零扩展,加载表的地址并查找结果。

#include <limits.h>

int is_lower_101(char a)
{
    static char t[UCHAR_MAX+1] = {
        [(unsigned char) 'a'] = 1,
        [(unsigned char) 'b'] = 1,
        [(unsigned char) 'c'] = 1,
        [(unsigned char) 'd'] = 1,
        [(unsigned char) 'e'] = 1,
        [(unsigned char) 'f'] = 1,
        [(unsigned char) 'g'] = 1,
        [(unsigned char) 'h'] = 1,
        [(unsigned char) 'i'] = 1,
        [(unsigned char) 'j'] = 1,
        [(unsigned char) 'k'] = 1,
        [(unsigned char) 'l'] = 1,
        [(unsigned char) 'm'] = 1,
        [(unsigned char) 'n'] = 1,
        [(unsigned char) 'o'] = 1,
        [(unsigned char) 'p'] = 1,
        [(unsigned char) 'q'] = 1,
        [(unsigned char) 'r'] = 1,
        [(unsigned char) 's'] = 1,
        [(unsigned char) 't'] = 1,
        [(unsigned char) 'u'] = 1,
        [(unsigned char) 'v'] = 1,
        [(unsigned char) 'w'] = 1,
        [(unsigned char) 'x'] = 1,
        [(unsigned char) 'y'] = 1,
        [(unsigned char) 'z'] = 1,
    };
    return t[(unsigned char) a];
}

【讨论】:

    【解决方案4】:

    为确保字符是否小写,请使用 ASCII 表。 http://www.asciitable.com/index/asciifull.gif 所以如果字符代码在 97 到 122 之间 - 它是小写的

    【讨论】:

    • Karen 不能使用整数值来确定字符是否为小写。我也错过了那部分。
    • 是的,我不能使用整数值。 :(
    • 是的,现在我明白了,那么,您可以使用例如字节而不是整数吗?那会像作弊一样工作:)
    • 字节而不是整数?抱歉,我是编程新手。
    • 我的意思是 char 类型,长度为 1 个字节。如果您声明 'unsigned char' 变量,它的范围将是 0..255,足以处理字符。但我不确定这是你需要的
    猜你喜欢
    • 2013-10-09
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多