我的程序在经过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;
}
答案 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'字符,所以只需将其取出即可。