#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(){
int n=1,i,cont;
char string[50];
scanf("%d",&n);
while(n!=0){
gets(string);
cont=0;
for(i=0;i<strlen(string);i++){
if(string[i]=='.'){
cont++;
}
}
if(cont%2==0){
printf("S\n");
}else{
printf("N\n");
}
scanf("%d",&n);
}
return 0;
}
我的问题很简单但很麻烦,我想读取一个整数值n,然后读取一个字符串,然后再次读取n,但每当我运行程序时,它只读取字符串值...但是如果我数字0程序结束......就像我的scanf在获取功能中一样。
答案 0 :(得分:2)
将scanf
与gets
或fgets
混合是很麻烦的,因为它们各自处理新行不同。
摆脱gets
电话(无论如何都不安全)并将其替换为以下scanf
电话:
scanf("%49s", string);
这将最多49个字符读入string
(即比其大小少一个)。
答案 1 :(得分:0)
从OP&#39; comments,听起来目标是能够读取包含空格的字符串。虽然有很多方法可以使用scanf()
来实现这一目标,但最好使用fgets()
,这至少不容易出错。
fgets()
函数可用于将数字的输入读入缓冲区,然后sscanf()
可以处理此缓冲区以提取数字。由于fgets()
保留换行符,因此不会干扰下一个I / O操作。
但是,当fgets()
用于获取字符串时,由于保留了换行符,因此可能需要将其删除。这可以通过多种方式完成,但此处strcspn()
用于提供遇到的第一个\r
或\n
字符的索引;然后将\0
字符写入此位置,从字符串中删除终止换行符。
以下代码说明了这些建议。请注意,buffer[]
和string[]
都被慷慨地分配,以适应相当大的输入。如果用户输入大量字符(在这种情况下超过999),则在输入流中留下额外的字符用于下一个I / O函数调用。还要注意主循环已经简化了一点;现在有一个for(;;)
循环永远不会终止,当用户输入0
数字时就会中断。并且,主循环中有一个嵌套循环,提示用户输入一个数字,直到输入有效数字。由于#include <stdlib.h>
是不必要的,因此将其删除。更好的代码会检查从fgets()
调用返回的值是否存在可能的错误。
#include<stdio.h>
#include<string.h>
int main(void)
{
int n = 1, cont;
char buffer[1000];
char string[1000];
for (;;) {
/* Loop until user enters a number */
do {
printf("Please enter a number: ");
fgets(buffer, sizeof buffer, stdin);
} while (sscanf(buffer, "%d", &n) != 1);
/* Break on 0 */
if (n == 0) break;
/* Get a string, and remove trailing newline */
printf("Please enter a string\n");
fgets(string, sizeof string, stdin);
string[strcspn(string, "\r\n")] = '\0';
cont = 0;
for (size_t i = 0; i < strlen(string); i++) {
if (string[i] == '.') {
cont++;
}
}
if (cont % 2 == 0){
printf("S\n");
} else {
printf("N\n");
}
}
return 0;
}
答案 2 :(得分:-3)
当你为一个例子输入5时,你会在之后点击一个新的行字符。 所以你输入2个字符:5和一个换行符。 这个新的角色正在引起你的头痛。
新行字符也被视为输入。
为了忽略这个新的行char,只需添加一个充当垃圾收集的新行:
char garbage[50];
scanf( "%d", &n);
fgets(garbage, sizeof(garbage), stdin);