新手在这里。执行期间的C函数问题

时间:2019-05-11 11:27:38

标签: c

编辑:由于我了解我需要提供更多信息以使您清楚明白,所以我添加了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.

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");