strlen не производит правильное число и strncpy не работает - PullRequest
0 голосов
/ 20 сентября 2018

Я ранее заставил это работать, но когда я реализовал функции, мои символы вызвали у меня много проблем.Я также проверил, показывает ли strlen правильное число, но показывает что-то странное.Если я введу 10-символьный символ, он даст мне 73 (его значение возрастает до 7, затем перезапускается счет, поэтому 14 символов будут 77).Первый strncpy работает, но другой ничего не отображает.

1 Ответ

0 голосов
/ 20 сентября 2018

Просто чтобы вы пошли по правильному пути, я очистил ваш код.

#include<stdio.h>
#include<string.h>
#define MAX 100

void TestIfPalin(char *palindrome)
{
    // TODO
    printf("TestIfPalin(%s)\n", palindrome);
}

// Given a user-input string of the form "Command(argument)"
// split the string (by inserting \0 characters) into two parts
// and remove the brackets "()" from around the argument
void DetermineWhatCommand(char *userInput)
{
    // look for the left-most '('
    char *left_bracket = strchr(userInput, '(');
    if (left_bracket != NULL)
    {
        // Seperate the command-name from the argument
        *left_bracket = '\0';

        // Look for the right-most ')' in the input
        char *right_bracket = strrchr(left_bracket+1, ')');
        if (right_bracket != NULL)
            *right_bracket = '\0';  // remove the right bracket, it's not needed further
        //else
        //  TODO - error?  No finishing bracket

        // Find the word passed to the function
        char *argument = left_bracket+1;

        if (strcmp(userInput,"Palin") == 0)
            TestIfPalin(argument);
    }
    else
    {
        // No brackets - what sort of command is it?
        // TODO - error message?
    }
 }


char *GetUserInput(char *userInput)
{
    printf("> ");
    fgets(userInput, MAX, stdin);
    userInput[strcspn(userInput, "\n")] = '\0';

    return userInput;
}


int main()
{
    char userInput[MAX] = { '\0' };
    char exitTest[]     = "exit";

    while(strcmp(exitTest, userInput) != 0)
    {
        GetUserInput(userInput);
        if (strcmp(exitTest, userInput) != 0)
            DetermineWhatCommand(userInput);
    }

    return 0;
}

Функции должны иметь одну задачу.TestIfPalin() не должен искать команду выхода, равно как и getUserInput().

Вы пытались прочитать несуществующий userInput символ *.Убедитесь, что вы понимаете разницу между char-указателями и char-массивами.Массив char, например:

char userInput[MAX];

Имеет MAX символов пространства.Принимая во внимание, что:

char *userInput;

Не имеет пробела и просто указывает куда угодно (возможно, NULL, но это не гарантируется).Это должно указывать на то, что будет использоваться.

char *userInput;
char buffer[MAX];

strcpy(buffer, "bananas");    // OK
strcpy(userInput, "empty!");  // FAILS
userInput = buffer; // userInput is now pointing at buffer
strcpy(userInput, "empty!");  // WORKS (overwrites 'bananas')
...