3

我刚刚开始使用 C 语言进行编程,并且正在编写一个密码/解密程序。要求用户输入存储为 char * 的短语。问题是程序只存储字符串的第一个单词,然后忽略它之后的所有内容。这是获取字符串然后对其进行分析的代码部分

int maincalc(int k)                         //The Calculation Function for Cyphering
{
    char *s;
    s=(char*) malloc(sizeof(100));
    printf("Please enter the phrase that you would like to code: ");  
    fscanf(stdin,"%s %99[^\n]", s);
    int i=0;
    int n=strlen(s);

    while(i<n)
    {
        if(s[i]>=65&&s[i]<=90)              //For Uppercase letters
        {
            int u=s[i];
            int c=uppercalc(u,k);
            printf("%c",c);
        }
        else if(s[i]>=97&&s[i]<=122)    //For Lowercase letters
        {
            int u=s[i];
            int c=lowercalc(u,k);
            printf("%c",c);
        }
        else 
            printf("%c",s[i]);          //For non letters
        i++;
    }
    free(s);
    printf("\n");
    return 0;
} 

只需要知道如何让程序确认整个字符串的存在,而不仅仅是第一个单词。谢谢

4

1 回答 1

2

不,没有一个工作。使用 fscanf 不会等待用户输入。它只是打印“请输入短语...”然后退出 fgets 也做同样的事情,程序不等待输入,只是打印“请输入...”然后退出。

在该评论中,在编辑之前,您提到了一些先前的输入。我的精神调试能力告诉我,输入缓冲区中仍有来自先前输入的换行符。那会让

fgets(s, 100, stdin);

fscanf(stdin, "%99[^\n]", s);

立即返回,因为他们立即遇到表示输入结束的换行符。

在获取更多字符串输入之前,您需要使用缓冲区中的换行符。你可以使用

fscanf(stdin, " %99[^\n]", s);

格式开头的空间消耗输入缓冲区中的任何初始空白,或清除输入缓冲区

int ch;
while((ch = getchar()) != EOF && ch != '\n);
if (ch == EOF) {
    // input stream broken?
    exit(EXIT_FAILURE);
}

fgets在使用或获取输入之前fscanf

于 2013-03-02T14:06:54.777 回答