编辑:由于我了解我需要提供更多信息以使您清楚明白,所以我添加了main函数和getchoice以及正在运行的程序的两个图像。我的问题是输入结束词后,我想先查看菜单然后做出选择,而它提示我输入而不显示菜单。
此功能是较大程序的一部分,但这是发生问题的地方。 它将读取输入的单词,并将它们放入数组中,直到输入关键字**** END。但是,输入此关键字后,它不会立即进入指定的if子句(您将在代码中看到它)。我是新手,可能确实很明显,但是对您的帮助非常感谢。
#include <string.h>
#define M 50
#define N 15
void getText(char a[M][N])
{
int i, j;
char temp[N];
for (i = 0; i < 50; i++) {
for (j = 0; j < 15; j++) {
if (i == 49 && j == 14) {
printf("Maximum length of text reached.\n");
}
scanf("%s\n", temp);
if (strcmp(temp, "****END") == 0) {
printf("You entered the endkey.\n");
return;
}
strcpy(a[i], temp);
}
}
}
int main(){
int input;
while(1){
input = getChoice();
if(input == 1){
getText(text);
}
else if(input == 2){
getDictionary();
}
else if(input == 3){
correctText();
}
else if(input == 4){
saveText();
}
else if(input == 5){
getStats();
}
else if(input == 6){
break;
}
}
return 0;
}
int getChoice(){
int temp;
printf("Choose function:\n1: Enter text\n2: Enter dictionary\n3: Correct text\n4: Save text\n5: Get text statistics\n6: Exit program\n");
scanf("%d", &temp);
return temp;
}
Entered the endword and now it waits for input instead of showing the menu.
I inputed 2 for the second program function, then it showed the menu and proceeded to function 2.
答案 0 :(得分:1)
除了不必要的双重嵌套循环外,此行
scanf("%s\n", temp);
应该是
scanf("%s", temp);
通常,您不应该尝试将结尾的空格与scanf
匹配,格式说明符%s
会自动过滤掉开头的空格(但请注意,%c
不会)。
还有其他错误,显示的代码本来是不完整的,但值得注意的是,%s
的输入长度必须加以限制,以防止缓冲区溢出。
答案 1 :(得分:0)
#include <stddef.h> // size_t
#include <ctype.h> // isspace()
#include <stdio.h> // scanf(), puts()
#include <string.h> // strcmp()
// see https://stackoverflow.com/questions/2653214/stringification-of-a-macro-value
#define STRINGIFY(x) #x
#define STRING(x) STRINGIFY(x)
#define LINES 50
#define COLS 15
char const *end = "****END";
// throw away everything until a newline is found
void clear(FILE *stream)
{
int ch;
while ((ch = getc(stream)) != EOF && ch != '\n');
}
size_t getText(char dst[LINES][COLS + 1])
{
size_t i = 0;
for (; i < LINES; i++) {
char temp[COLS + 1] = { 0 };
scanf("%" STRING(COLS) "s", temp); // "%15s" at runtime.
int ch;
// if the next character is not whitespace ...
if ((ch = getchar()) != EOF && !isspace(ch)) {
puts("Warning: Input too long, was truncated!");
clear(stdin);
}
if (strcmp(temp, end) == 0) {
puts("You entered the endkey.");
return i;
}
strcpy(dst[i], temp);
}
return i;
}
int main(void)
{
// COLS + 1 ... we need space for the terminating newline character.
char foo[LINES][COLS + 1];
size_t n = getText(foo);
for (size_t i = 0; i < n; ++i)
puts(foo[i]);
}
在未指定宽度来限制要存储的字符的情况下,切勿使用%s
转换说明符:
char foo[10];
scanf("%9s");