C中的指针和数组

时间:2013-03-26 22:23:10

标签: c arrays pointers

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

“编写一个函数void sticky(char * word),其中word是单个单词,例如”sticky“或”RANDOM“.pixed()应修改单词以”粘性大写“出现(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;

}

7 个答案:

答案 0 :(得分:5)

您需要使用strlen而不是sizeof来查找char *字符串的长度

答案 1 :(得分:3)

修改您的change upperchange 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来查找字符串长度,因此仅转换sizeofsizeof始终返回4(取决于计算机)。 use strlen(word)在以下for循环中找到字符串 word 的长度:

for (int i = 0; i < strlen(word); i++)
{
}

答案 2 :(得分: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.
        }
    }
}

请注意,我尚未实施isUpperCaseisLowerCase功能; D

答案 3 :(得分:0)

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

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

例如:

int i = 0;
while ( word[i] != 0 ) {
  // do lower/upper case conversion.
}

答案 4 :(得分:0)

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

答案 5 :(得分:0)

您的代码出了问题:您将奇数字符设为大写,甚至更低,但您不会首先检查它们是低级还是大写。但是降低已经小写的字母会给你一个错误的值(对于已经大写字母的“加上”也是如此)。

所以你应该这样做:

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

toLowerCase相同。

答案 6 :(得分: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;

}