c - 如何将字符串的第一个字母转换为大写
问题描述
这是为了学校作业。该函数的目标是从每个数组中随机选择一个单词并创建一个新数组,其中每个句子的第一个字母大写,每个单词之间有空格,末尾有句点 20 次。句子遵循冠词、名词、动词、介词、冠词和名词的格式。
我的问题是如何将每个句子的第一个字母大写?我试图将字符串中的第一个位置设置为等于该位置的字符 - 32,但这只会使程序崩溃。
void randomize(void) {
char *article[] = {"the", "a", "one", "some", "any"};
char *noun[] = {"boy", "girl", "dog", "town", "car"};
char *verb[] = {"drove", "jumped", "ran", "walked", "skipped"};
char *preposition[] = {"to", "from", "over", "under", "on"};
char *sentence[6];
int running = 1;
while(running){
int location = rand()%5;
char *captFirstLetter = article[location];
captFirstLetter[0] = captFirstLetter[0] - 32 ;
sentence[0] = captFirstLetter;
sentence[1] = noun[rand()%5];
sentence[2] = verb[rand()%5];
sentence[3] = preposition[rand()%5];
sentence[4] = article[rand()%5];
sentence[5] = noun[rand()%5];
for(int i = 0; i < 7; i++){
printf("%s%s%s", (i == 6) ? "" : sentence[i], (i > 4) ? "" : " ", (i == 5)? ".\n" : "" );
}
running ++;
if(running == 21){
running = 0;
}
}
}
解决方案
哦,不不不 - SegFault:
您可以使用以下命令创建指向字符串文字的指针:
char *captFirstLetter = article[location];
您不能修改. article
您尝试修改它们,例如
captFirstLetter[0] = captFirstLetter[0] - 32 ;
调用未定义的行为,很可能是立即的 SegFault。字符串文字存储在只读内存中并且不能更改(除了最古老和最晦涩的硬件之外的所有硬件)
要解决此问题,请确保 指向的字符串article
是数组而不是字符串文字。例如,声明article
为一个足够大的二维数组:
char article[][8] = {"the", "a", "one", "some", "any"};
此外,当您正确减去32
以翻转第 6 位(关闭小写位)时,标准库提供了宏toupper()
来<ctype.h>
处理这种情况并进行适当的检查,以确保大小写更改仅限于小写字符。例如:
#include <ctype.h>
...
captFirstLetter[0] = toupper(captFirstLetter[0]);
最后,将其放在一个简短的示例中,解释上述两个问题,您将拥有:
#include <stdio.h>
#include <ctype.h>
int main (void) {
char article[][8] = {"the", "a", "one", "some", "any"};
size_t n = sizeof article / sizeof *article;
int location = 2;
char *captFirstLetter = article[location];
captFirstLetter[0] = toupper(captFirstLetter[0]);
for (size_t i = 0; i < n; i++)
puts (article[i]);
}
示例使用/输出
$ ./bin/cmplitp2a
the
a
One
some
any
如果您还有其他问题,请告诉我。
推荐阅读
- reactjs - React Leaflet Map 无法正确渲染
- python - 我需要什么 SQL 语句将数据插入当前为“空”的多行?
- android - Kotlin - Firebase 数据库 - 将 DataSnapShot 转换为 Hashmap
- bash - 替换或更新 bash 脚本中的一行
- php - 选择所有提交的复选框值存在于 mySQL 列中的逗号分隔字符串中的所有行
- javascript - VueJs 强制组件重新加载
- javascript - 如何将文本区域中的文本保存到本地存储
- python - 子进程在 Windows 上的 pid 错误
- c# - WPF DataGrid:在编辑单元格时添加一行会破坏编辑关闭检测
- python - Python re.sub() 没有替换字符串