2013-03-02 60 views
3

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

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; 
} 

只需要知道如何做才能让程序确认,不仅整个字符串的第一个字的存在。谢谢

+1

+1因为没有考虑'gets()' – axiom 2013-03-02 13:41:09

+0

我太新了,不能靠近gets()我不希望我的电脑爆炸。 – shea 2013-03-02 14:02:32

回答

2

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

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

fgets(s, 100, stdin); 

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

立即返回,因为他们马上遇到信号输入端的换行符。

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

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

在格式开头的空间消耗任何初始空白在输入缓冲区,或获取输入与任何fgetsfscanf之前清除输入缓冲区

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

+1

良好的调试能力:-) – cnicutar 2013-03-02 14:09:19

+0

是的,有一个先前的输入,一个int。但是,在用户输入数字(这是密码/破译腐败)程序继续之后,代码中的任何地方都没有/ n。我没有指定一个新行,但它可能会被程序自动按惯例放在那里。 – shea 2013-03-02 14:22:17

+1

Bravo, fscanf(stdin,“%99 [^ \ n]”,s);解决它,谢谢 – shea 2013-03-02 14:24:53