Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 输入为奇数字符量时打印空字符_C++_C_Null - Fatal编程技术网

C++ 输入为奇数字符量时打印空字符

C++ 输入为奇数字符量时打印空字符,c++,c,null,C++,C,Null,我一直在玩弄这个c程序有一段时间了,我似乎不知道我缺少了什么 在我的代码的最底层,我有一个函数,它用“-”替换所有其他单词。 我的问题是,当我输入一个奇数字时,例如“猫”、“狗”、“汉堡”,它会在我认为是空字符的位置放置一个“-”,尽管我还不能揭穿它 谢谢你的帮助 #include <stdio.h> #include <stdlib.h> #include <string.h> void replace(char w[]);

我一直在玩弄这个c程序有一段时间了,我似乎不知道我缺少了什么

在我的代码的最底层,我有一个函数,它用“-”替换所有其他单词。 我的问题是,当我输入一个奇数字时,例如“猫”、“狗”、“汉堡”,它会在我认为是空字符的位置放置一个“-”,尽管我还不能揭穿它

谢谢你的帮助

    #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]='-';}
    }
}