C 仅记录第一个单词的字符串

C 仅记录第一个单词的字符串,c,string,word,C,String,Word,我刚刚开始用C语言编程,正在编写一个cypher/decypher程序。要求用户输入一个短语,该短语存储为char*。问题是程序只存储字符串的第一个字,然后忽略其后的所有内容。下面是获取字符串然后对其进行分析的代码部分 int maincalc(int k) //The Calculation Function for Cyphering { char *s; s=(char*) malloc(sizeof(100)); p

我刚刚开始用C语言编程,正在编写一个cypher/decypher程序。要求用户输入一个短语,该短语存储为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;
} 
int maincalc(int k)//加密的计算函数
{
char*s;
s=(char*)malloc(sizeof(100));
printf(“请输入要编码的短语:”);
fscanf(stdin,“%s%99[^\n]”,s);
int i=0;
int n=strlen(s);
而(i=65&&s[i]=97&&s[i]
不,两者都不起作用。使用fscanf不会等待用户输入。它只需打印“请输入短语…”然后退出fgets也会做同样的事情,程序不等待输入,只需打印“请输入…”然后退出

在那篇评论中,在编辑之前,你提到了一些以前的输入。我的心理调试能力告诉我,在输入缓冲区中仍然有一个来自先前输入的换行符。这将使

fgets(s, 100, stdin);

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

在获得更多字符串输入之前,需要使用缓冲区中的换行符

fscanf(stdin, " %99[^\n]", s);
格式开头的空格使用输入缓冲区中的任何初始空白,或清除输入缓冲区

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

在使用
fgets
fscanf

+1获取输入之前,因为没有考虑
gets()
我太新了,无法接近gets()。我不想让我的计算机爆炸。是的,之前有一个输入,一个int。但是在用户输入数字后,代码中的任何地方都没有a/n(这是密码/解密程序)程序继续。我还没有指定新行,但按照惯例,程序可能会自动将其放入其中。@shea如果用户在终端上输入号码,程序(通常)只有在用户按enter键后才接收输入。这会生成保留在输入缓冲区中的换行符。@丹尼尔:是的,我就是这么想的。谢谢。还有%99[/n]告诉计算机在忽略第一个/n时读取99个字符?@shea第一个
'\n'
由上一次输入的换行符匹配;它还将匹配用户在行首输入的任何空格。之后,
%99[^\n]
匹配最多99个不同于
'\n'
的字符,并将它们存储在
s
中(然后在它们后面添加一个0-termnator)。因此,如果用户输入
“免费啤酒!”
,则
s
的内容将变为
“免费啤酒!”
不带前导空格。如果不需要,请使用
fgets
并手动删除换行符。
int ch;
while((ch = getchar()) != EOF && ch != '\n);
if (ch == EOF) {
    // input stream broken?
    exit(EXIT_FAILURE);
}