C:程序跳过下一个输入

时间:2016-11-29 20:51:01

标签: c fgets

我的程序在经过1次后跳过下一个输入。我已经阅读了删除fgets所具有的换行符的主题,但没有that was suggested worked。有什么可以与微软视觉工作室一起使用?最好的建议是“单词[strcspn(words,”\ r \ n“)] = 0;”这并没有删除新行,除非我格式错误。我不允许使用strtok函数。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SIZE 50
#define STOP "quit\n"

char *copywords(char *dest, const char *source, size_t n);

int main(void) 
{

    char words[50];
    char newwords[50];
    size_t num;

    for (;;) {

        printf("\nType a word, or type 'quit' to quit: ");
        (fgets(words, SIZE, stdin));


        if (strcmp(words, STOP) == 0) {
            printf("Good bye!\n");
            return 0;
        }

        printf("Type the # of chars to copy: ");
        scanf_s("%d", &num);

        copywords(newwords, words, num);
        printf("The word was %s\n", words);
        printf("and the copied word is %s", newwords);


    }
}

char *copywords(char *dest, const char *source, size_t n) {
    size_t i;
    for (i = 0; i < n && source[i] != '\0'; i++) {
        dest[i] = source[i];
    }
    dest[i] = '\0';
    return dest;
}

3 个答案:

答案 0 :(得分:0)

问题是当您调用scanf时,将\ n留在输入上。即用户键入 number [return]。你读了这个号码。当你循环并再次调用fgets时,返回仍然等待被读取,以便fgets得到它并立即返回。

我可能只是在第二次调用fgets时调用fgets,然后使用sscanf从字符串中读取。即。

SIGKILL

另外,我还要说检查返回值,因为fgets或* scanf很容易失败。

答案 1 :(得分:0)

  

我的程序在经过1次后跳过下一个输入。

如果我理解正确,问题是scanf_s(我假设它就像C标准的scanf)将数字读入num,但scanf不会从stdin中删除以下换行符,因此在下一次迭代中循环fgets将看到换行符并表现得好像它看到一个空行。 我通常因为这个原因而避免使用scanf,而是将一行读入缓冲区然后解析它。例如:

char buf[50];
...
fgets(buf,sizeof(buf),stdin);
sscanf(buf,"%d",&num);

(我还建议在整个过程中添加更多的错误检查。)

答案 2 :(得分:0)

这是一个简单的解决方案。

RewriteRule

由于我们知道由于scanf会在流中留下额外的'\ n'字符,所以只需将其取出即可。