将字符串中最长的单词升级为C中的大写字母

时间:2018-12-07 00:33:14

标签: c string pointers

我需要在C中编写一个获取“ char * str”的函数(void),该字符串包含定界符(char *定界符=“?:,-space”)。该功能需要更新字符串本身,以便最长的单词将以大写字母书写。

到目前为止,这是我的代码:

void
longestInCaptital(char *str)
{
    char *delimiters = "?:,- ";
    char copyOfStr[strlen(str)];

    strcpy(copyOfStr, str);
    char *temp = strtok(copyOfStr, delimiters);
    int maxLetters = 0;
    char *tempIndex;

    while (temp) {
        if (strlen(temp) > maxLetters) {
            maxLetters = strlen(temp);
            tempIndex = temp;
        }
        temp = strtok(NULL, delimiters);
    }
    str = tempIndex;
    int i;

    for (i = 0; i < maxLetters; i++) {
        str[i] = toupper(str[i]);
    }
}

我试图使它工作,但是不能, 谢谢你的帮手!

2 个答案:

答案 0 :(得分:1)

使用strtok的strspn / strcspn可能更容易做到这一点,因为您要在适当的位置更新字符串并且不想在其上全部写NUL:

void longestInCaptital(char *str) {
    char *delimiters = "?:,- ";
    char *longest = 0;
    size_t longest_len = 0, len;
    while (*str) {
        str += strspn(str, delimiters);  // skip any initial delimiter
        len = strcspn(str, delimiters);  // how long is this word?
        if (len > longest_len) {
            longest = str;
            longest_len = len; }
        str += len };
    while (longest_len-- > 0) {
        *longest = toupper(*longest);
        ++longest; }
}

strspn为您提供了所传递的字符集中字符串开头的字符数。 strcpsn为您提供不在集合中的号码。

答案 1 :(得分:0)

您非常接近。您只需要将副本中最大字符串开头的 offset 应用于原始的地址。

另外,请注意,copyOfStr必须为+1才能说明EOS字符。

注意:我对此进行了测试:

void
longestInCaptital(char *str)
{
    char *delimiters = "?:,- ";
    char copyOfStr[strlen(str) + 1];

    strcpy(copyOfStr, str);

    int maxLetters = 0;
    char *tempIndex = NULL;

    char *temp = strtok(copyOfStr, delimiters);
    while (temp) {
        int curlen = strlen(temp);
        if (curlen > maxLetters) {
            maxLetters = curlen;
            tempIndex = temp;
        }
        temp = strtok(NULL, delimiters);
    }

    int i;

    // get starting offset within _original_ string
    str += (tempIndex - copyOfStr);

    for (i = 0; i < maxLetters; i++) {
        str[i] = toupper(str[i]);
    }
}