2015-06-26 2 views
-1

Я пытаюсь решить судью UVAa Online Problem 272 — TeX Quotes.У меня проблемы с моим ответом в «Uva tex quotes» (проблема с интервалом)

Ввод будет состоять из нескольких строк текста, содержащих четное число символов с двойной кавычкой ("). Вход заканчивается символом конца файла. Текст должен быть выхода точно так, как это было ввод за исключением того, что:

  • в каждой паре первого " заменяется два ` символов: `` и
  • в каждой паре второго " заменяются два ' символов: ''.

Я не знаю, почему мой код дает неправильный ответ; Я думаю, что это правильный ответ.

#include <stdio.h> 
#include <stdbool.h> 
#include <string.h> 
int main(){ 
    char kalimat[100000]; 
    int i; 
    int max; 
    bool flag=true; 
    while (scanf("%c",&kalimat)!=EOF){ 
     max=strlen(kalimat); 
     for (i=0;i<=max;i++){ 
      if (kalimat[i]=='"') 
      { 
       if (flag==true){ 
        printf("``"); 
        flag=false; 
       } else { 
        printf("''"); 
        flag=true; 
       } 
      } else { 
       printf("%c",kalimat[i]); 
      } 
     } 
    } 
    return(0); 
} 
+0

Пожалуйста, не просто ссылку на проблему: сделать ваш вопрос самодостаточным, то есть: обобщить эту проблему в вашем вопросе, добавить ожидаемый результат и фактический результат. Вы всегда можете добавить ссылку для получения дополнительной информации. – Evert

+0

Вы упомянули: «Я не знаю, почему мой код дает неправильный ответ, я думаю, что это правильный ответ». Ну, что вы получите? Каким должен был быть ответ (согласно заданной проблеме? – Evert

+0

Вы действительно попробовали отладить свою программу, поставив, например, инструкции printf в свой код, чтобы узнать, какие значения имеют значения «kalimat',' max' и 'i'? – Evert

ответ

0

Обратите внимание, что зсапЕ ("% С", & Kalimat) будет считывать только 1 (один) символ за один раз. Так что strlen (kalimat) всегда будет 1. Не актуальная проблема, но просто нечетная (например, вы можете объявить char kalimat вместо массива символов, а не использовать индексирование или цикл for).

Ваш for-loop, однако, идет от 0 до max включительно, поэтому kalimat будет проиндексирован за пределы и приведет к неопределенному поведению. Возможно, ваша проблема есть.

Фактически, поскольку kalimat является единственным символом, он не будет иметь завершающего символа '\0' и, следовательно, не является допустимой строкой C. Следовательно, strlen никогда не может вычислить правильную длину (которая равна 1).

Попробуйте это:

char kalimat; 
... 
while (scanf("%c", kalimat) != EOF) { 
     if (kalimat == '"') { 
      if (flag){ 
       printf("``"); 
       flag = false; 
      } else { 
       printf("''"); 
       flag = true; 
      } 
     } else { 
      printf("%c", kalimat); 
     } 
    } 
} 
+0

Нет гарантируем, что 'strlen (kalimat) == 1'; в буфере может быть тарабарщина, потому что она не инициализирована (хотя на некоторых платформах есть нулевые байты) –

+0

@JonathanLeffler Это верно. Этот первый параграф был написан до того, как я понял отсутствующий нулевой ограничитель, после которого я написал третий абзац. Конечно, это также почему «strlen» удаляется из предлагаемого кода. – Evert