在C中使用从一个函数到另一个函数的用户输入字符串

时间:2015-12-07 01:03:47

标签: c string function switch-statement

所以......主要问题是如何使用用户在另一个函数中输入的字符串?我知道在main函数中完成所有操作要容易得多,但我们不得不尽可能多地使用它们。提前致谢。

2 个答案:

答案 0 :(得分:1)

在评论之后,您很可能希望在两个函数可用的范围内声明str

int enterWord (char *str) {   
    ...
    scanf("%24s", str);
    ...
    return str[0];
}

int menuScan (char *str) {
    ...
}

int main (void) {

    char str[25] = {0};
    int someint;
    ...

    someint = menuScan (enterWord (str));

    return 0;
}

int main (void) {

    char str[25] = {0};
    int someint, someotherint;
    ...

    someint = enterWord (str);
    ...
    someotherint = menuScan (str);

    return 0;
}

您可能还想对用户输入进行一些额外的错误检查,例如:

int enterWord (char *str) {   

    printf ("Please enter a single word that is no more than 25 characters: ");

    if (scanf ("%24s", str))
        printf ("\nThanks! You entered:  %s", str);
    else
        return -1;

    return str[0];
}

...

int main (void) {

    char str[25] = {0};
    int someint, someotherint;
    ...

    if ((someint = enterWord (str)) = -1) {
        fprintf (stderr, "enterWord() error: input failure.\n");
        return 1;
    }
    ...
    someotherint = menuScan (str);

    return 0;
}

剩余问题' \ n'留在输入缓冲区

您的剩余问题来自于您致电scanf后,您将在输入缓冲区'\n'中离开[Enter](因为按stdin)。下次程序调用{​​{1}}时,它会将输入缓冲区中的scanf作为用户输入。 (如果您检查,您会发现它使用的值'\n'(或0xa)是10的值

您有两种选择。您可以使用循环清空newline

stdin

您还可以使用int c; while ((c = getchar()) != '\n' && c != EOF) {} 的赋值抑制运算符来读取和丢弃换行符,例如:

scanf

其中scanf ("%24[^\n]%*c", str) 读取最多24个字符(不包括%24[^\n]'\n')和str读取并丢弃单个字符(%*c) 。这样,在下一个用户输入之前,输入缓冲区为空。

这是一个简短的工作示例:

newline

<强>编译

#include <stdio.h>

int enterWord (char *str);
void menuOptions ();
int menuScan (char *str);

int main (void) {

    char str[25] = {0};

    if (enterWord (str) == -1) {
        fprintf (stderr, "enterWord() error: input failure.\n");
        return 1;
    }

    do {
        menuOptions();
    } while (!menuScan (str));

    return 0;
}

int enterWord (char *str)
{   
    printf ("Please enter a single word that is no more than 25 characters: ");

    if (scanf ("%24[^\n]%*c", str))
        printf ("\nThanks! You entered:  %s", str);
    else
        return -1;

    return str[0];
}

void menuOptions ()
{
    printf("\n\n=========   MENU   =========\n\n");
    printf("Key     Function\n");
    printf("===     ========\n");
    printf(" C      Count the letters\n");
    printf(" V      Count the vowels\n");
    printf(" R      Reverse the word\n");
    printf(" P      Check if the word is a palindrome\n");
    printf(" W      Enter a new word\n");
    printf(" Z      Exit\n\n");
}

int menuScan (char *str)
{
    /* always initialize variables */
    char *p = str;
    char menuChoice = 0;
    int c = 0;
    int charcnt = 0;

    printf ("Please enter a character from the options above: ");
    if (!scanf ("%c%*c", &menuChoice)) {
        fprintf (stderr, "menuScan() error: input failure.\n");
        return -1;
    }
    printf ("\nYou entered: %c\n", menuChoice);

    c = menuChoice;  /* I don't like to type */

    /* validate input */
    if (c < 'A' || ('Z' < c && c < 'a') || 'z' < c) {
        fprintf (stderr, "menuChoice() error: input is not [a-z] or [A-Z]\n");
        return -1;
    }

    /* convert to lowercase */
    if ('A' <= c && c <= 'Z') c += 32;

    switch (c) {
        case 'c': 
            for (; *p; p++) charcnt++;
            printf ("\n\nThere are '%d' letters in '%s'\n", charcnt, str);
            break;
        case 'z':
            return -1;
        default : printf ("(%c) invalid choice -> try again.\n", c);
    }

    return 0;
}

示例/用途

gcc -Wall -Wextra -finline-functions -O3 -o bin/menuscan menuscan.c

答案 1 :(得分:0)

您的代码存在很多问题,但我只会解决您提出的实际问题。

如果您有一个创建要在其他地方使用的结果值的函数,则需要在函数结束时返回该值。 &#39;返回&#39;关键字将执行此操作,但您必须记住,在函数结束后,返回的事物必须继续存在(如评论中的@David C. Rankin所述)。

当函数结束时,本地声明的变量将不复存在,因此解决方案是在更广泛的范围内声明它们。

// declare the string in a wider scope
// provide one extra character space for the string terminator \0 character
char inputStr[25 + 1];
// pass the string to the function which will fill it with the entered string
// NOTE: to avoid risk of someone entering too many letters in the string, we
// also pass in the length of the string buffer
enterWord(inputStr, 25);

对enterWord函数的更改将是:

void enterWord(char* str, int length){
    printf("Please enter a single word that is no more than %d characters: ", length);
    // this should verify the length of the entered text to make sure it isn't too long... but that's not your question
    scanf("%s", str);
    printf("\nThanks! You entered:  %s", str);
}

在您声明inputStr的范围内,该字符串现在将包含用户输入的数据。

在这种情况下,我们通过与&f 39; return&#39;不同的机制从函数返回字符串。关键词。这里我们传递一个指向缓冲区空间第一个字母的指针,这样函数就会从函数内部填充原始的inputStr缓冲区。

如果您必须使用功能更强大的功能。在编码范例中,您可能需要考虑使用&#39; malloc&#39;在堆上为缓冲区分配空间,然后您需要记住使用&#39; free&#39;在代码的稍后部分释放分配的内存并避免内存泄漏,这就是为什么在这种情况下这不是我首选的解决方案。