所以......主要问题是如何使用用户在另一个函数中输入的字符串?我知道在main函数中完成所有操作要容易得多,但我们不得不尽可能多地使用它们。提前致谢。
答案 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;在代码的稍后部分释放分配的内存并避免内存泄漏,这就是为什么在这种情况下这不是我首选的解决方案。