【问题标题】:strlen not producing right number and strncpy not workingstrlen 不产生正确的数字和 strncpy 不工作
【发布时间】:2018-09-19 23:36:22
【问题描述】:

我之前已经让它工作了,但是当我实现功能时,我的字符给了我很多问题。我还检查了 strlen 是否显示了正确的数字,但它显示了一些奇怪的东西。如果我输入一个 10 个字符长的字符,它会给我 73(它上升到 7 然后重新开始计数,所以 14 个字符将是 77)。第一个 strncpy 有效,但另一个不显示任何内容。

【问题讨论】:

  • 你没有为“userInput”分配空间...
  • strncpy not NUL 终止副本。无论您听到什么,它几乎都不是您想要的。但是,strncmp 对于比较子字符串和目标很有用。
  • 您应该查看“strncpy”的手册页......在某些情况下,它不会终止目标字符串。
  • 另外,您还没有完全验证用户输入的格式...例如,如果他们输入: Palin(1 这条语句会导致由“stringLength - 8" 变为负数:strncpy (charsInsideParen, userInput + 6, stringLength - 8);
  • sizeof (userInput) 在 GetUserInput 函数中是指针的大小,可能是 4 或 8,而不是分配内存的长度。

标签: c function strlen strncpy


【解决方案1】:

为了让你走上正轨,我清理了你的代码。

#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 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')

【讨论】:

  • @Matthew - 我在 // TODO - error? No finishing bracket 的代码中留下了评论。也许将userInput 设置为无效命令,因此它不会做任何进一步的处理?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多