2013-12-17 2 views
1

Я некоторое время играл с этой программой, и я не могу понять, что мне не хватает.Печать нулевого символа при вводе нечетного количества символов

В самом низу моего кода у меня есть функция, которая заменяет каждое другое слово «-». Моя проблема заключается в том, что когда я ввожу нечетное числовое слово, например «Кот», «собака», «гамбургер», он поместит «-» в том, что я считаю нулевой символьной позицией, хотя я не смог развенчать его.

Благодарим за помощь!

#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; 
     } 
    } 
} 
+1

Лучше, если вы дадите пример ввода и вывода, которые ожидаются и получаются в настоящее время. – Chinna

+0

, если 'a% 2! = 0', а не конец строки, а приращение на 2 - это то, что вы хотите? – moeCake

+0

@moeCake Это правильно. Я хочу увеличить «a» на два. –

ответ

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; 
    } 
} 
+0

Это сделало. Большое спасибо, сэр! –

2

От fgets manual;

fgets() читает не более чем в один меньше, чем размер символов из потока и сохраняет их в буфер, на который указывает с. Чтение останавливается после EOF или новой строки. Если прочитана новая строка, она сохраняется в буфере. Конечный нулевой байт (\ 0) сохраняется после последнего символа в буфере.

Ввод новой строки - это то, что вы заменяете.

+0

Итак, вы предлагаете использовать что-то другое, кроме fgets()? –

+0

Вы можете добавить еще одну проверку, если строка конца - это новая строка, замените ее на «\ 0». – moeCake

+0

@ user3109767 Не обязательно. Вы можете либо удалить любую новую строку перед запуском 'remove', просто проверив, является ли последний символ новой линией, и если она установлена ​​в' \ 0', или вы можете изменить существующий цикл, чтобы проверить, есть ли строка для строки и удалить ее, если она найдена. –

0

Я думаю, что замена fgets только с gets будет работать: Try:

//fgets(x,100,stdin);

gets(x);

и

//fgets(y,100,stdin);

gets(y); 

Этого будет достаточно, я думаю.

+0

'gets()' нахмурился, потому что он не выполняет проверку границ и представляет собой угрозу безопасности от атак переполнения буфера. Обрезка новой строки с результатами 'fgets()' является более безопасным решением. – woolstar

0

Проблема вызвана дополнительным символом '\ n' в массиве символов, переданным функции replace.

Например, если вход «Cat», переданный символ char [] 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; 
    } 
} 
0

Как немного в сторону, может я предлагаю структурировать код замены() по-разному

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

Это гораздо более удобным для чтения. Ломать в середине петли ... не так много.

Смежные вопросы