Linux Mint下GCC编译时toupper()函数无法正常工作的问题
解决
toupper()不生效的问题 嘿,我看你碰到toupper()函数没起作用的问题了,这其实是个很容易踩的小坑!
问题根源
toupper()函数不会直接修改你传入的原字符,它的设计是返回转换后的大写字符。你现在的代码只是调用了函数,但完全没把返回的结果存回原数组里,所以inputText[i]自然还是原来的样子。
另外还有个细节要注意:如果你的字符是有符号类型(比如char在很多系统上是有符号的),当字符值为负数时(比如某些扩展ASCII字符),toupper()的行为是未定义的,所以最好先把字符转成unsigned char再传入。
修改后的代码片段
把你那行无效的toupper()调用改成这样:
// 别忘了先包含 <ctype.h> 头文件! #include <ctype.h> // ... 你的其他代码 ... do { scanf(" %[^\n]" , inputText ); // 这里的格式串多了个s,应该去掉,%[^\n]已经是匹配非换行符的所有字符了 printf("Input text supplied is: %s\n", inputText); int input_text_size = strlen(inputText); // 这里不需要减1,strlen返回的是有效字符数,循环用i < input_text_size更稳妥 for(int i = 0; i < input_text_size; i++) { inputText[i] = toupper((unsigned char)inputText[i]); // 关键:把返回值赋值回去 printf("toupper val = %c\n", inputText[i]); // ... 你的其他测试代码 ... } } while(...); // 你代码里的循环条件没写完,记得补上
额外提醒
- 一定要包含
<ctype.h>头文件,否则toupper()可能会因为隐式声明导致行为异常; - 你原来的
scanf格式串" %[^\n]s"里多了个s,%[^\n]已经是完整的格式说明符了,多余的s会导致输入匹配失败; strlen(inputText) - 1的写法有风险,如果输入是空字符串,strlen返回0,减1后会变成负数,循环会出问题,直接用strlen(inputText)作为循环上限,循环条件写成i < input_text_size更安全。
内容的提问来源于stack exchange,提问作者von
相关产品推荐
相关产品推荐

