- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想知道 C 中的 toupper() 函数是如何工作的。我正在下面的代码中尝试,但我肯定做错了什么。代码可以编译,但是传递给 toupper() 的参数没有被大写...
char **copyArgs(int argc, char **argv) {
char **a = malloc(sizeof(char *) * (argc));
int i;
for(i = 0; i < argc; i++) {
int size = strlen(argv[i]);
a[i] = malloc(sizeof(char) * (size + 1));
strcpy(a[i], argv[i]);
a[i] = toupper(a[i]);
}
return a;
}
如果我用“一二”测试它,结果是“一二”,而不是“一二”。任何建议表示赞赏。
最佳答案
toupper
将单个字母转换为大写。在你的例子中,由于 C 在隐式转换中的宽恕,你正在传递一个指向它而不是 char
的指针,所以很明显它不能正常工作。可能您会收到“没有转换的隐式整数转换指针”警告:这是一个强烈的信号,表明您正在做一些非常错误的事情。
整个事情并没有因为在您的平台上 int
和指针一样大(或者至少对于您正在使用的那些指针足够大)而爆炸; toupper
尝试将 int
解释为一个字符,发现它不是字母并返回它未修改。这是纯粹的运气,在其他平台上你的程序可能会崩溃,因为指向 int
转换的指针被截断,并且因为 toupper
在 之外的整数上的行为unsigned char
范围(加上 EOF
)未定义。
要将整个字符串转换为大写,您必须遍历所有字符并对每个字符调用 toupper
。您可以轻松编写执行此操作的函数:
void strtoupper(char *str)
{
while(toupper((unsigned char)*str++))
;
}
注意 unsigned char
转换 - 所有处理字符分类和转换的 C 函数需要 int
是 EOF
(保持不变)或者是 unsigned char
的值。原因很悲哀也很复杂,我已经详述了in another answer .
仍然值得注意的是,toupper
设计 不能可靠地处理多字节字符编码(例如 UTF-8),因此它在现代文本中没有实际位置处理(通常大多数 C 语言环境设施都是在另一个时代(糟糕地)设计的)。
关于c - 上层函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15057899/
我有一个在 Android 上运行的 FMX 项目。我可以让 FMX 项目在“libTest.so”中执行一个 C 函数,如下所示: main.pas: TMyCallbackFun = proc
我是一名优秀的程序员,十分优秀!