尝试获取小写字符串,并在将字符变为大写后创建新字符串
#include <ctype.h>
#include <cs50.h>
#include <stdio.h>
#include <string.h>
int main (void)
{
string word = "science";
char new_word[] = {};
for (int i = 0, len = strlen(word); i < len; i++)
{
if (islower(word[i]))
{
new_word = new_word + toupper(word[i]);
}
}
}
我收到“错误:数组类型“char[0]"不可赋值”。
这还不是全部,我相信我的完整程序可能有一个更简单的方法,但是我构建了其他所有的东西,我唯一挣扎的一点是循环通过我的字符串,以获得一个大写的新词。
任何帮助将不胜感激!
4条答案
按热度按时间wz1wpwve1#
新的char数组的长度为
0
,当您在其边界之外访问它时,任何访问都会调用未定义行为(UB)。如果编译器支持VLA:
如果没有:
以及
如果使用
calloc
,请不要忘记free
分配的内存vc6uscn92#
未定义的行为当
word[i] < 0
通过以
unsigned char
的形式访问字符串来避免这种情况根据C参考关于toupper()
中间顶部(中间通道);
ch -要转换的字符。如果ch的值不能表示为〉unsigned char且不等于EOF,则行为未定义。
这是不正确的,编译器给出错误,“错误:为数组类型为”“的表达式赋值
数组类型为赋值的LHS时不允许这样做。已更改为
new_word[i] = toupper((unsigned char)word[i]);
产出:科学
**编辑:**仅回应M.M给出的解决方案的注解和大卫C.兰金铸造的注解。阅读M.M和David C. Rankin的以下注解从
islower()
和toupper()
中删除unsigned char
f1tvaqid3#
ni65a41a4#
命名数组不能在C中调整大小,你必须正确地设置大小:
注意,当
new_word
的大小由函数调用决定时,没有初始化器可以用于new_word
(一个蹩脚的规则,但它就是这样);并且可以去掉len
循环变量,因为它已经在前面定义过了。然后将每个字符设置到位:
但是要小心周围的
if
语句:如果该值为false,则需要设置new_word[i] = word[i]
。(Pro提示,您可以完全删除
if
,因为toupper
被定义为如果字符不是小写则无效)。最后,结尾处应该有一个空终止符:
注意:从技术上讲,对
toupper
的调用应该是:toupper((unsigned char)word[i])
--查看toupper
的文档以了解更多信息。