Как получить вывод только 4 ">" на стандартный вывод - PullRequest
0 голосов
/ 11 марта 2019

Я должен был создать рюкзак-программу, которая могла бы принимать числа и сохранять их счет, а также иметь интерфейс, подобный интерфейсу пользователя, в который пользователь мог вводить команды, такие как сохранение и загрузка из файла. Хотя все это прекрасно работает, и код для этого приведен ниже, у меня возникают трудности с получением ожидаемого результата теста для этой программы.

Мне интересно, что я делаю не так и почему для вывода стандартного кода "> " не производится. Если я удаляю строку fprintf(stdout, "> "); из остальной части, то на стандартный вывод выводится 3 "> ". Я должен быть в состоянии напечатать 4 из них, но я озадачен тем, как это возможно. Я использую travis-ci.com, чтобы протестировать этот тестовый пример, и именно здесь он показывает мне ошибку неудачного завершения. Полный код и контрольный пример ниже.

Токовый выход

    Your stderr:
Error: Bad item "abc"
Error: Bad item "xyz"
unknown command: d

Желаемый выход

    Expected stdout:
> > > > 
    Expected stderr:
Error: Bad item "abc"
Error: Bad item "xyz"
Unknown command: d

knapsack-testcase4.sh

#!/bin/bash

echo "Test case 4"
echo "Bad commands"
echo "a abc"
echo "r xyz"
echo "d"
echo -e "Error: Bad item \"abc\"\nError: Bad item \"xyz\"\nUnknown command: d" > expectedstderr.tmp
echo -ne "> > > > " > expectedstdout.tmp
echo -e "a abc\nr xyz\nd" | ./knapsack-shell 1>actualstdout.tmp 2>actualstderr.tmp &
sleep 1
killall -9 knapsack-shell

echo "  Expected stdout:"
cat expectedstdout.tmp
echo ""
echo "  Expected stderr:"
cat expectedstderr.tmp

stdoutres=`diff expectedstdout.tmp actualstdout.tmp | wc -l`
stderrres=`diff expectedstderr.tmp actualstderr.tmp | wc -l`
if [ $stdoutres -eq 0 ] && [ $stderrres -eq 0 ]; then
    echo "Test passed"
else 
    if [ $stdoutres -ne 0 ]; then
        echo "  Your stdout:"
        cat actualstdout.tmp
        echo ""
    fi
    if [ $stderrres -ne 0 ]; then
        echo "  Your stderr:"
        cat actualstderr.tmp
    fi
    rm *.tmp
    exit 1
fi
rm *.tmp

ранец-shell.c

#include <stdio.h>
#include "knapsack.c"
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define BUFFER_SIZE 1000
void removeSpaces(char *str1)
{
    char *str2;
    str2=str1;
    while (*str2==' ') str2++;
    if (str2!=str1) memmove(str1,str2,strlen(str2)+1);
}

int main()
{
    listitemptr k2 = NULL;
    char input[100];
    char command;
    int i, returnval = 0;
    char filename[250];
    char userfile[260];
    char buffer[BUFFER_SIZE];
    char *error;
    int totalRead = 0;
    fprintf(stdout, "> ");  
   for (;;) {
       FILE* pf = NULL;

        if (!fgets(input, sizeof input, stdin))
            break;
        i = strspn(input, " \t\n");  /* skip blanks */
        command = input[i++];
        if (command == 'q' && input[i] == '\n')
            break;
        if (command == 'p') {
            KnapsackPrint(&k2);
    fprintf(stdout, "> ");
            continue;
        }
        if (command == 'a') {
            int item;
            if (sscanf(input + i, "%i", &item) != 1) {
                error = input + i;
                removeSpaces(error);
        fprintf(stdout, "> ");  
                fprintf(stderr, "Error: Bad item \"%s\"\n", strtok(input + i, "\n"));

                continue;
            }
            KnapsackAdd(&k2, item);
            KnapsackPrint(&k2);
    fprintf(stdout, "> ");
            continue;
        }
        if (command == 'r') {

            int item;
            if (sscanf(input + i, "%i", &item) != 1) {
                error = input + i;
                removeSpaces(error);
        fprintf(stdout, "> ");
                fprintf(stderr, "Error: Bad item \"%s\"\n", strtok(input + i, "\n"));
                continue;
            }

            if(KnapsackRemove(&k2, item) == -1){
                fprintf(stderr, "Error: item %d does not exist in knapsack\n", item);
    fprintf(stdout, "> ");
                continue;
            }else{
            KnapsackPrint(&k2);
        fprintf(stdout, "> ");
            continue;
            }

        }
        if(command == 's'){
            if(( pf = fopen(input + i, "a")) != NULL){
                error = input + i;
                removeSpaces(error);
                KnapsackPrint2(&k2, pf);
                fprintf(stdout, "stored in file \"%s\"\n", strtok(input+i, "\n"));
    fprintf(stdout, "> ");
            }else{
                error = input + i;
                removeSpaces(error);
        fprintf(stdout, "> ");
                fprintf(stdout, "Error: unable to save file \"%s\"\n", strtok(input+i, "\n"));
            }
            continue;
        }
        if(command == 'l'){
            if((pf = fopen(input + i, "r")) != NULL){
                error = input + i;
                removeSpaces(error);
                fprintf(stdout, "loaded from file \"%s\"\n", strtok(input+i, "\n"));
                fprintf(stdout, "knapsack:");
                while(fgets(buffer, BUFFER_SIZE, pf) != NULL){
                    totalRead = strlen(buffer);

                    buffer[totalRead -1] = buffer[totalRead -1] == '\n' ? '\0' : buffer[totalRead -1];

                    printf("%s\n", buffer);
            fprintf(stdout, "> ");
                }

            }else {
                error = input + i;
                removeSpaces(error);
        fprintf(stdout, "> ");
                fprintf(stderr, "Error: unable to load file \"%s\"\n", strtok(input+i, "\n"));

            }
            continue;
        }
        else{

        fprintf(stderr, "unknown command: %s", input);
    fprintf(stdout, "> ");          
        }


     }
    return returnval;
}
...