2016-11-01 8 views
-2

Я сталкиваюсь с чем-то интересным, где странные символы печатаются вместо того, что я ожидаю. Раньше это не делалось, но я начал играть с fgets и sscanf, и теперь он не вернется к тому, как это было. Я предполагаю, что я где-то испорчен, или что-то оставил в буфере stdin, но не совсем уверен. Есть идеи?C: Неверные символы печатаются, предполагаемая память. issue

Что я ожидаю:

*************************************************************************** 
*                   * 
*                   * 
* 1) What char for border?            * 
* 2) Add question              * 
* 3) Remove Question             * 
* 4) Print last answers            * 
* 5) Exit                * 
*                   * 
*                   * 
*                   * 
*                   * 
*************************************************************************** 

Что на самом деле печать (как вы можете видеть, это печать обалденный у и потребляя пространство):

*************************************************************************** 
*                   * 
*                   * 
* 1) What char for border?            * 
* 2) Add question              * 
* 3) Remove Question             * 
* 4) Print last answers            * 
* 5) Exit                * 
*                   * 
* ÿ                 * 
*                   * 
*                   * 
*************************************************************************** 

Вот мой код:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

typedef struct f_in{ 
    char outline; 
    int lines; 
    int rows; 
    int num_args; 
} F_IN; 

typedef struct args_in { 
    char in_string[20]; 
    int t_format; 
} ARGS_IN; 

void printInterface(char argQs[5][50], char argChar); 

int main(int argv, char** argc){ 
    char defaultQuestions[5][50] = { { "1) What char for border?" } 
     , { "2) Add question" } 
     , { "3) Remove Question" } 
     , { "4) Print last answers" } 
    , { "5) Exit" } }; 
    int commandEntry, exitFlag, i; 
    char borderChar = '*', addQ[50], userInp[10]; 

    exitFlag = 1; 

    while (exitFlag){ 
     printInterface(defaultQuestions, borderChar); 

     // GET INITIAL INPUT FROM USER 
     printf("Enter the integer value for the command you wish to select: "); 
     fgets(userInp, sizeof(userInp), stdin); 
     // VERIFY INPUT IS VALID 
     sscanf(userInp, "%d", &commandEntry); 
     printf("\nYou selected: %s\n", defaultQuestions[commandEntry - 1]); 

     if (commandEntry == 1){ 
      printf("Please enter the character you wish to be the border: "); 
      scanf("\n%c", &borderChar); 
     } 
     else if (commandEntry == 2){ 
      printf("What question would you like to add? (only enter 50 char max)\n"); 
      fgets(addQ, 50, stdin); 
      printf("This was your question: %s", addQ); 
     } 
     else if (commandEntry == 5){ 
      printf("Goodbye!\n"); 
      exitFlag = 0; 
     } 
    } 
    return 0; 

} 

void printInterface(char argQs[5][50], char argChar){ 
    int i, j; 
    int lineCnt = 13; 
    int borderLen = 75; 

    for (i = 0; i<100; i++){ 
     printf("\n"); 
    } 

    for (i = 0; i<lineCnt; i++){ 

     if (i == 0 || i == lineCnt - 1){ 
      for (j = 0; j<borderLen; j++){ 
       printf("%c", argChar); 
      } 
      printf("\n"); 
     } 

     else if (i >= 3 && i <= 10){ 
      printf("%c %s", argChar, argQs[i - 3]); 
      for (j = 0; j < ((borderLen - strlen(argQs[i - 3]))-6); j++){ 
       printf(" "); 
      } 
      printf("%c\n", argChar); 
     } 

     else{ 
      for (j = 0; j<borderLen; j++){ 
       if (j == 0){ 
        printf("%c", argChar); 
       } 
       else if (j == (borderLen - 1)){ 
        printf("%c\n", argChar); 
       } 
       else{ 
        printf(" "); 
       } 
      } 
     } 
    } 

    for (i = 0; i<10; i++){ 
     printf("\n"); 
    } 

} 
+1

Похоже, вы на правильном пути. Вы должны продолжать отлаживать и не надеяться, что другие люди сделают это за вас! – John3136

+0

(Не пишите, _never_ настоящего раскомментированного кода. После того, как вы выяснили, откуда приходит барахло (подсказка: это не из памяти искажений), попробуйте make 'printf()' выравнивать выравнивание строк для вас.) – greybeard

ответ

3

Trick здесь, когда отладка всегда проверяет, что происходит, используя первые/последние индексы. Если Вы регистрируетесь:

else if (i >= 3 && i <= 10){ 
    printf("%c %s", argChar, argQs[i - 3]); 
    for (j = 0; j < ((borderLen - strlen(argQs[i - 3]))-6); j++){ 
     printf(" "); 
    } 
    printf("%c\n", argChar); 
} 

argChar имеет 5 записей, но вы пытаетесь получить доступ к 8 в argQs[i - 3]) при i=10 (условие if (i >= 3 && i <= 10)). В C вы не получите причудливую ошибку IndexOutOfRange, вы в основном получите доступ к другому реестру памяти в местоположении BASE_ADDR + 8.

В C массивы и указатели почти взаимозаменяемы, так как оба указывают адрес блока памяти. Поскольку массив в основном представляет собой последовательный блок памяти, имя массива является указателем на первый элемент. Пример: array[25] эквивалентен *(array + 25).

Надежда помогает.

+0

Wow, this было намного проще, чем я думал. Я зашел слишком далеко в сорняках, думая, что это была коррупция в stdin-буфере, вызвавшая это. Спасибо за тонну за это! – Dpry12