2015-09-16 36 views
13

我的程序可以接受任意数量的长度或空输入。但是,如果输入为空(空格或换行符),程序将继续等待输入。我也尝试过fgets,但是如果按下空格/换行符,它仍会在关闭之前等待更多不是空格/换行符的输入。在C中接受空字符串

Simpified代码:

#include <stdio.h> 
main(){ 
int num; 
scanf("%i",&num); 
printf("%i",num); 
} 

输入:

363792 

输出:

363792 

期望:

输入:

输出:

我是C的新手,我很难完成此任务。

使用与fgets什么尝试:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
main(){ 

int n; 
char s[20]; 


fgets(s,20,stdin); 
n=atoi(s); 

printf("%i",n); 
} 

编辑:原来我没有被编译代码的权利。所以每次我尝试进行更改时,都会使用scanf查看原始代码。

+0

意思是,你想忽略空输入(空格或换行符)? – RDX

+1

如果你没有输入这个代码输出0,它是你的愿望吗? – ashiquzzaman33

+2

'scanf'不能按预期工作,因为'%d'跳过前导空格字符。 –

回答

19

我也试着与fgets但如果按下空格/换行符,它仍在等待更多的投入是不打烊前一个空格/换行符。

首先fgets将在这种情况下工作。如果您向我们展示了您正在尝试使用fgets()做什么,那么对此问题的回答将会非常狭窄或非常具体。

我试图用fgets()来做同样的事,下面是代码片段。

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

int main(int argc, char *argv[]) 
{ 
    char string[100]; 
    printf("Enter a number: "); 

    fgets (string, 100, stdin); 
    /* Here remove the trailing new line char; not required unless you are trying to print the string */ 
    string[strlen(string) - 1] = '\0'; 

    printf("Num is %d\n", atoi(string)); 

    return 0; 
} 

如果没有输入或只需输入或空间并输入,然后打印数量将为零,且与fgets()不会等到你输入有效的数字。

此外,请检查为什么你不应该使用得到Do not use gets()

+0

我曾尝试过这样的代码。我只是没有意识到新代码没有被编译:(谢谢你的帮助!它的工作原理! – JavvaTheHutt

+1

'string [strlen(string) - 1] ='\ 0';'当没有'''时错误地截断\ n''。如果第一个字符是一个罕见的嵌入式''\ 0'',那么它是未定义的行为。关于这一行,最好使用http://stackoverflow.com/a/28462221/2410359 – chux

+1

:'string [strlen字符串) - 1] ='\ 0';'这在所有情况下都不能正常工作,原因有两个:1)如chux所述,如果没有换行符,则行会被破坏。 2)如果在windows/dos下运行,(换行符实际上是两个字符),这不会删除换行符,只会损坏它。建议使用类似:'char * offset = strstr(string,“\ n”); if(NULL!= offset)* offset ='\ 0';' – user3629249

5

你应该阅读文字输入字符和停止阅读,如果读取字符不是一个数字:

char ch; 
while(1) 
{ 
    ch=getchar(); 
    if(isdigit(ch)) 
    { 
     putchar(ch); 
    } 
    else 
    { 
     break; 
    } 
} 
+2

由于getchar返回int,所以'ch'应该是'int'。 –

7

scanf()

定义功能将读取并忽略任何空白在下一个非空白字符之前遇到的字符。

所以你不能使用scanf()得到你想要的结果。 由于gets()不安全,它行为不端。如果您需要使用atoi(),则可以使用fgets()获取输入并将其转换为整数。

下面的示例代码,你可以尝试:

#include <stdio.h> 
#include<stdlib.h> 
#include<string.h> 
main() 
{ 
    int num; 
    char ch[100]; 
    fgets(ch, sizeof ch, stdin); 
    if (strlen(ch)>1&& ch[strlen(ch)-1] == '\n') 
    { 
     ch[strlen(ch)-1] = '\0'; 
     num = atoi(ch); 
     printf("%i\n", num); 
    } 
} 
+6

这是一个坏主意。 [永远不要使用'gets()'。](http://stackoverflow.com/q/1694036/1679849) –

+0

@Enzo Ferber请澄清“为了忽略空格,需要一个空格在格式之前”。当然''scanf(“%d”,...)'和'scanf(“%d”,...)'同样扫描'int'。 – chux

+0

@chux是的,我以为我已经删除了它。 –

1

好吧,你不明白scanf()做了什么,它会扫描整个输入字符串并寻找像%d,%f,%s这样的特殊字符,直到它没有得到字符串中的内容为止等待。

scanf("%d %d", a, b); 

,当你进入2个整数值将只得到完成,如果按下空格就不能算作整型值,因此它会忽略它。