2

我是 C 和编程的新手。我被困在家庭作业中。我的输出仅显示大写的第一个字符,以及一些奇怪数字的以下字符。有人可以查看我的代码并就我做错了什么以及解决问题的方法给我一些提示吗?非常感谢您的帮助!

“编写一个函数 void sticky(char* word),其中 word 是单个词,例如“sticky”或“RANDOM”。sticky() 应该修改该词以显示为“sticky caps”(http://en.wikipedia。 org/wiki/StudlyCaps ), 即字母必须大小写交替, 第一个字母以大写开头. 例如, "sticky" 变成 "StIcKy" 和 "RANDOM" 变成 "RaNdOm" . 注意字符串的结尾,用 '\0' 表示。您可以假设将合法字符串提供给 sticky() 函数。"

#include <stdio.h>
#include <stdlib.h>

/*converts ch to upper case, assuming it is in lower case currently*/
char toUpperCase(char ch)
{
 return ch-'a'+'A';
}

/*converts ch to lower case, assuming it is in upper case currently*/
char toLowerCase(char ch)
{
 return ch-'A'+'a';
}

void sticky(char* word){
 /*Convert to sticky caps*/

for (int i = 0; i < sizeof(word); i++)
{
    if (i % 2 == 0)
    {
        word[i] = toUpperCase(word[i]);
    }
    else
    {
        word[i] = toLowerCase(word[i]);
    }
}

}

int main(){
/*Read word from the keyboard using scanf*/
char word[256];
char *input;
input = word;
printf("Please enter a word:\n");
scanf("%s", input);

/*Call sticky*/
sticky(input);

/*Print the new word*/
printf("%s", input);

for (int i = 0; i < sizeof(input); i++)
{
    if (input[i] == '\n')
    {
        input[i] = '\0';
        break;
    }
}

return 0;

}

4

7 回答 7

5

您需要使用strlennotsizeof来查找 char* 字符串的长度

于 2013-03-26T22:27:59.523 回答
3

修改你的change upperandchange lower函数

/*converts ch to upper case,*/
char toUpperCase(char ch)
{
    if(ch>='a' && ch<='z')/*If condition just to make sure current letter is in  lower case*/
        return ch-'a'+'A';
}

/*converts ch to lower case, assuming it is in upper case currently*/
char toLowerCase(char ch)
{
    if(ch>='A' && ch<='Z')/*If condition just to make sure current letter is in  Upper case*/
        return ch-'A'+'a';
}

此外,仅four characters在您sizeof用于查找字符串长度时才进行转换。sizeof总是返回 4(取决于机器)。 在以下 for 循环中查找字符串单词use strlen(word)的长度:

for (int i = 0; i < strlen(word); i++)
{
}
于 2013-03-26T22:31:10.887 回答
2

您应该使用strlen而不是sizeof. 此外,您必须检查您的字母是大写还是小写:

for (int i = 0; i < strlen(word); i++)
{
    if (i % 2 == 0)
    {
        if ( isLowerCase(word[i]) )
        {
            word[i] = toUpperCase(word[i]);
        }
        else
        {
            // do nothing.
        }
    }
    else
    {
        if ( isUpperCase(word[i]) )
        {
            word[i] = toLowerCase(word[i]);
        }
        else
        {
            // do nothing.
        }
    }
}

请注意,我还没有实现isUpperCaseandisLowerCase函数;D

于 2013-03-26T22:28:29.783 回答
0

您的代码中有问题:您将奇数字符设置为大写,甚至将字符设置为小写,但您首先没有检查它们是小写还是大写。但是降低一个已经小写的字母会给你一个错误的值(“大写”一个已经大写的字母也是如此)。

所以你应该这样做:

char toUpperCase(char ch)
{
 if ((ch >= 'a') && (ch <= 'z')) {
   return ch-'a'+'A';
 } else {
   return ch;
 }
}

和同样的toLowerCase

于 2013-03-26T22:29:38.437 回答
0

非常感谢您的提示!使用您的建议,我修改了我的代码,它现在可以工作了。

以下是我修改后的代码:

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

/*converts ch to upper case, assuming it is in lower case currently*/
char toUpperCase(char ch){
    return ch-'a'+'A';
}

/*converts ch to lower case, assuming it is in upper case currently*/
char toLowerCase(char ch){
    return ch-'A'+'a';
}



void sticky(char* word)
{
 /*Convert to sticky caps*/

for (int i = 0; i < strlen(word); i++)
{
    if (i % 2 == 0)
    {
        if (word[i] >= 'a' && word[i] <= 'z')
        {
            word[i] = toUpperCase(word[i]);
        }

    }
    else
    {
        if (word[i] >= 'A' && word[i] <= 'Z')
        {
            word[i] = toLowerCase(word[i]);
        }

    }
}

}

int main(){
/*Read word from the keyboard using scanf*/
char word[256];
char *input;
input = word;
printf("Please enter a word:\n");
scanf("%s", input);

/*Call sticky*/
sticky(input);

/*Print the new word*/
printf("%s", input);

for (int i = 0; i < sizeof(input); i++)
{
    if (input[i] == '\n')
    {
        input[i] = '\0';
        break;
    }
}

return 0;

}

于 2013-03-27T00:06:41.360 回答
0

函数sizeof()用于计算数据类型的大小,而不是分配给指针的大小。

所以你不能像这样使用它sizeof(word)。相反,迭代一个字符,直到你偶然发现一个\0,它表示字符串的结尾。

例如:

int i = 0;
while ( word[i] != 0 ) {
  // do lower/upper case conversion.
}
于 2013-03-26T22:27:28.133 回答
0

sizeof (word)是一个 char * 的大小,你必须用数组大小​​传递另一个参数...或者使用 strlen()。

于 2013-03-26T22:27:54.293 回答