簡體   English   中英

如何將字符串的首字母轉換為大寫

[英]How to covert the first letter of a string to a uppercase

這是用於學校作業。 此功能的目標是從每個數組中隨機選擇一個單詞,然后創建一個新數組,每個句子的首字母大寫,每個單詞之間加一個空格,最后一個句號結束20次。 該句子的格式為冠詞,名詞,動詞,介詞,冠詞和名詞。

我的問題是我該如何大寫每個句子的首字母? 我試圖將字符串中的第一個位置設置為等於該位置的char-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聲明為具有足夠大小的2D數組:

    char article[][8] = {"the", "a", "one", "some", "any"};

此外,當您正確減去32以翻轉第6位(小寫位關閉)時,標准庫在<ctype.h>提供了宏toupper()來處理該情況,並進行適當的檢查以確保大小寫更改僅限小寫字符。 例如:

#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

如果您還有其他問題,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM