Программа всегда отступает после печати массива char? - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть задание написать программу, которую можно использовать в оболочке bash, которая имитирует определенные команды Unix по умолчанию, и мы должны создавать их с нуля.Одной из этих команд является команда PS1, которая должна изменить подсказку $ на любой аргумент, заданный командой.Я реализовал это в коде ниже, и он работает почти идеально.

До использования команды PS1 приглашение работает правильно, оно печатает $ и не делает отступ, скорее, оно позволяет пользователю продолжать печатать в той же строке.Однако после использования команды каждый раз, когда предполагается появление приглашения, программа распечатывает приглашение и затем переходит на новую строку.Мне нужно, чтобы печатать PS1 char * без перехода на новую строку.

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

int main(int argc, char *argv[]) {
    int exit = 0;
    char* PS1 = "$";
    while(exit == 0){
        char* token;
        char* string;
        char input[500];
        printf("%s", PS1);
        fgets (input, 500, stdin);
        token = strtok(input, " ");
        if(strncmp(token, "exit", 4) == 0){
            exit = 1;
            break;
        }
        else if(strncmp(token, "echo", 4) == 0){
             token = strtok (NULL, " ");
             while (token != NULL){
                printf ("%s", token);
                printf("%s", " ");
                token = strtok (NULL, " ");
             }
        }
        else if(strcmp(token, "PS1") == 0){
            token = strtok (NULL, " ");
            char temp[300];
            strcpy(temp, &input[4]);
            PS1 = temp;        }
    }
} 

1 Ответ

0 голосов
/ 19 февраля 2019

fgets сохраняет символ новой строки в конце, поэтому он печатается.Вы можете избавиться от этого после прочтения строки:

fgets (input, sizeof(input), stdin);
strtok(input, "\n");

У вашего кода есть другие проблемы:

    ... else if (strcmp(token, "PS1") == 0) {
        token = strtok (NULL, " ");
        char temp[300];
        strcpy(temp, &input[4]);
        PS1 = temp;
    }

Массив символов temp является локальным для блока в фигурных скобках ибудет недействительным после закрытия }.Это означает, что PS1 является дескриптором неверной памяти.Это неопределенное поведение.Возможно, он не виден прямо сейчас, но он укусит вас позже, когда вы добавите больше команд.

Может быть лучше сделать массив PS1, если символы, видимые на всем протяжении main, и скопировать втот.(Массив может быть инициализирован для хранения "$" в начале.)

Вам также следует избегать явного индекса на &input[4].Пусть токенизация с strtok справится с этим.В конце концов, может быть дополнительный пробел, и " PS1 Command: " является допустимым вводом.

...