C++ 输入为奇数字符量时打印空字符
我一直在玩弄这个c程序有一段时间了,我似乎不知道我缺少了什么 在我的代码的最底层,我有一个函数,它用“-”替换所有其他单词。 我的问题是,当我输入一个奇数字时,例如“猫”、“狗”、“汉堡”,它会在我认为是空字符的位置放置一个“-”,尽管我还不能揭穿它 谢谢你的帮助C++ 输入为奇数字符量时打印空字符,c++,c,null,C++,C,Null,我一直在玩弄这个c程序有一段时间了,我似乎不知道我缺少了什么 在我的代码的最底层,我有一个函数,它用“-”替换所有其他单词。 我的问题是,当我输入一个奇数字时,例如“猫”、“狗”、“汉堡”,它会在我认为是空字符的位置放置一个“-”,尽管我还不能揭穿它 谢谢你的帮助 #include <stdio.h> #include <stdlib.h> #include <string.h> void replace(char w[]);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void replace(char w[]);
int main( )
{
char w[100], x[100], y[100];
int z = 0;
printf("Player 1, please enter the secret word: ");
fgets(x,100,stdin);
// system("clear");
while( strcmp(x,y) != 0 )
{
strcpy(w,x);
// printf("\nLength of String : %d", strlen(w)-1);
replace(w);
printf("Player 2, the word is %s\n",w);
printf("Player 2, please guess the word: ");
fgets(y,100,stdin);
z++;
if( strcmp(x,y) != 0 )
{
printf("Wrong. Try again.\n");
}
else
{
//system("clear");
printf("Correct!\n");
printf("It took you %d attempt(s).\n",z);
switch (z)
{
case 1 :
case 2 :
printf("A. Awesome work!");
{break;}
case 3 :
case 4 :
printf("B. Best, that was!");
{break;}
case 5 :
case 6 :
printf("C. Concentrate next time!");
{break;}
case 7 :
printf("D. Don't quit your day job.");
{break;}
default :
printf("F. Failure.");
{break;}
}
}
}
getch();
}
void replace(char w[])
{
int a;
a = 0;
while (w[a] != '\0')
{
if (a % 2 != 0)
{
w[a] = '-';
a++;
}
if (w[a] != '\0')
{
a++;
}
else
{
break;
}
}
}
#包括
#包括
#包括
无效替换(字符w[]);
int main()
{
字符w[100],x[100],y[100];
int z=0;
printf(“玩家1,请输入密码:”);
fgets(x,100,标准偏差);
//系统(“清除”);
while(strcmp(x,y)!=0)
{
strcpy(w,x);
//printf(“\n字符串长度:%d”,strlen(w)-1);
替换(w);
printf(“播放器2,单词是%s\n”,w);
printf(“玩家2,请猜单词:”);
fgets(y,100,标准偏差);
z++;
if(strcmp(x,y)!=0)
{
printf(“错误。请重试。\n”);
}
其他的
{
//系统(“清除”);
printf(“正确!\n”);
printf(“您尝试了%d次。\n”,z);
开关(z)
{
案例1:
案例2:
printf(“A.很棒的作品!”);
{break;}
案例3:
案例4:
printf(“B.最好的,那是!”);
{break;}
案例5:
案例6:
printf(“C.下次集中精力!”);
{break;}
案例7:
printf(“D.不要放弃你的日常工作。”);
{break;}
违约:
printf(“F.失败”);
{break;}
}
}
}
getch();
}
无效替换(字符w[])
{
INTA;
a=0;
而(w[a]!='\0')
{
如果(a%2!=0)
{
w[a]='-';
a++;
}
如果(w[a]!='\0')
{
a++;
}
其他的
{
打破
}
}
}
来自
fgets()从流中最多读取一个小于大小的字符,并将它们存储到s指向的缓冲区中。EOF或换行符后,读取停止如果读取换行符,则将其存储到缓冲区。在缓冲区中最后一个字符之后存储终止的空字节(\0)
输入的换行符就是您要替换的换行符。您可以这样实现
int a;
int len;
a = 0;
len = strlen(w);
if(len%2 == 0)
len = len-1;
while (len!=a)
{
if (a % 2 != 0)
{
w[a] = '-';
a++;
}
if (w[a] != '\0')
{
a++;
}
else
{
break;
}
}
我认为将
fgets
替换为gets
将有效:
尝试:
//fgets(x,100,stdin)代码>
get(x)代码>
及
//fgets(y,100,stdin)代码>
我想这就足够了。问题是由传递给replace函数的char数组中的额外“\n”字符引起的
例如,当输入为“Cat”时,传递的字符[]w包含{'C'、'a'、't'、'\n'、'\0'};
附加的“\n”也将替换为“-”字符
下面将解决此问题
while (w[a] != '\0')
{
if (w[a] != '\0' && w[a] != '\n')
{
if (a % 2 != 0)
{
w[a] = '-';
}
a++;
}
else
{
break;
}
}
顺便提一下,我可以建议您以不同的方式构造replace()代码吗
void replace(char charw[])
{
int length=strlen(charw);
int i;
for (i=0;i<length;i++)
{
if (i%2==1) /*yes, i%2 would also work, but lets not get too clever*/
{charw[i]='-';}
}
}
void替换(char charw[])
{
整数长度=strlen(charw);
int i;
对于(i=0;如果您给出当前期望的样本输入和输出,iIt会更好。如果a%2!=0
,而不是字符串的结尾,a将增加2,这是您想要的吗?@moeCake这是正确的。我希望将“a”增加2。@Chinna例如,如果我输入“Cat”,则输出是“C-t-”所以你建议我使用fgets()以外的东西?如果字符串结尾是换行符,您可以再添加一个检查,将其替换为“\0”。@user3109767不一定。您可以在运行remove
之前删除任何换行符,只需检查最后一个字符是否是换行符,如果是,则将其设置为\0
,或者您可以修改现有循环以检查换行符,如果是,则将其删除d、 就是这样。非常感谢,先生!gets()
不受欢迎,因为它不进行边界检查,并且存在缓冲区溢出攻击的安全风险。从fgets()
的结果中删除换行符是更安全的解决方案。
void replace(char charw[])
{
int length=strlen(charw);
int i;
for (i=0;i<length;i++)
{
if (i%2==1) /*yes, i%2 would also work, but lets not get too clever*/
{charw[i]='-';}
}
}