我是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;
}
答案 0 :(得分:5)
您需要使用strlen
而不是sizeof
来查找char *字符串的长度
答案 1 :(得分:3)
修改您的change upper
和change 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(取决于计算机)。
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.
}
}
}
请注意,我尚未实施isUpperCase
和isLowerCase
功能; 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;
}