簡體   English   中英

將C中字符串中單詞的第一個字母大寫

[英]Capitalize first letter of a word in a string in C

我必須將每個單詞的第一個字母(單詞用空格分隔)大寫為給定的 char 數組。 我編寫了代碼,但我不知道為什么它不工作,也不在輸出中顯示任何內容。

這是代碼:

void LetterCapitalize(char *str) {
    char *str2;
    int i = 0;
    str2[i] = toupper(str[0]);
    i++;
    while (str[i]) {
        if (str[i] == ' ') {
            str2[i] = str[i];
            str2[i + 1] = toupper(str[i] + 1);
            i += 2;
        } else {
            str2[i] = str[i];
            i++;
        }
    }
    printf ("%s", str2);
}

這是主要的:

int main(void) {
    char stringa[16] = "some string here";
    LetterCapitalize(stringa);
    return 0;
}

對於初學者這個數組

char stringa[16] = "some string here";

不包含字符串,因為它沒有空間來容納用作初始值設定項的字符串文字的終止零字符'\0'

最好在不明確指定其大小的情況下按以下方式聲明它

char stringa[] = "some string here";

所以這個while循環

while (str[i])

可以調用未定義的行為。

此外,您正在使用未初始化的指針str2

char *str2;
//...
str2[i] = toupper (str[0]);

這再次調用未定義的行為。

請注意,傳遞的字符串在單詞之間可以包含多個空格,而且可以包含前導和尾隨空格。 所以這個 if 語句也可以調用未定義的行為,因為它跳過了源字符串的終止零字符'\0'

    if (str[i] == ' ')
    {

      str2[i] = str[i];
      str2[i + 1] = toupper (str[i] + 1);
      i += 2;
    }

因此,您的方法通常是錯誤的。

這樣的函數應該返回修改后的源字符串。

而不是 for 循環,最好使用標准 C 函數strspnstrcspn

這是一個演示程序。

#include <string.h>
#include <stdio.h>
#include <ctype.h>

char * LetterCapitalize( char *s )
{
    const char *delim = " \t";

    for (char *p = s; *p; p += strcspn( p, delim ) )
    {
        p += strspn( p, delim );

        if (*p) *p = toupper( ( unsigned char )*p );
    }

    return s;
}

int main( void )
{
    char stringa[] = "some string here";
    puts( stringa );
    puts( LetterCapitalize( stringa ) );
}

程序輸出為

some string here
Some String Here

有多個問題:

  • main中定義的字符串不是以空值結尾的,因為初始值設定項正好有 16 個字符,即數組的定義長度,因此空值終止符沒有空間。 省略數組長度並讓編譯器從初始化程序(包括空終止符)計算它更安全:
   char stringa[] = "some string here";  // sizeof stringa == 17
  • str2未初始化:向其中存儲字符具有未定義的行為。 您可以改為修改參數字符串或分配一個副本並修改它。

  • LetterCapitalize中的邏輯是有風險的:您假設單詞由一個空格分隔,並且字符串不以空格結尾。

  • toupper()char參數應轉換為(unsigned char)以避免在默認情況下對char類型進行簽名的平台上的負char值上出現未定義的行為。

這是修改后的版本:

#include <ctype.h>
#include <stdio.h>

char *LetterCapitalize(char *str) {
    unsigned char c, last = ' ';
    // uppercase characters that follow a space or at the start of the string
    for (size_t i = 0; (c = str[i]) != '\0'; last = c, i++) {
        if (last == ' ')
            str[i] = toupper(c);
    }
    return str;
}

int main() {
    char stringa[] = "some string here";
    puts(LetterCapitalize(stringa));
    return 0;
}

暫無
暫無

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

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