Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
接受C中的空字符串_C_Input - Fatal编程技术网

接受C中的空字符串

接受C中的空字符串,c,input,C,Input,我的程序可以接受任意长度的数字或空输入。但是,如果输入为空(空格或换行符),程序将继续等待输入。我也尝试了fgets,但如果按下空格/换行符,它仍然会在关闭前等待更多不是空格/换行符的输入 简化代码: #include <stdio.h> main() { int num; scanf("%i",&num); printf("%i",num); } 输出: 363792 期望的: 输入: 363792 输出: 363792 我是C语言的新手,

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

简化代码:

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

363792
期望的:

输入:

363792 
输出:

363792
我是C语言的新手,我很难做到这一点

尝试使用FGET的内容:

#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);
}
#包括
#包括
#包括
main()
{
int n;
chars[20];
fgets(s,20,stdin);
n=原子(s);
printf(“%i”,n);
}

编辑:原来我没有正确编译代码。因此,每次我尝试进行更改时,它都会使用scanf查看原始代码。

您应该逐个字符读取输入字符,如果读取的字符不是数字,则停止读取:

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

根据

函数将读取并忽略在下一个非空白字符之前遇到的任何空白字符

因此,使用
scanf()
无法获得所需的结果。 Asgets()不安全,而且行为异常。如果需要,可以使用
atoi()
,获取输入并将其转换为整数

下面是您可以尝试的示例代码:

#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);
    }
}
#包括
#包括
#包括
main()
{
int-num;
char-ch[100];
fgets(ch、ch尺寸、标准尺寸);
如果(strlen(ch)>1&&ch[strlen(ch)-1]=='\n')
{
ch[strlen(ch)-1]='\0';
num=atoi(ch);
printf(“%i\n”,num);
}
}
我也尝试了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;
}
#包括
#包括
#包括
int main(int argc,char*argv[])
{  
字符串[100];
printf(“输入一个数字:”);
fgets(字符串,100,标准输入);
/*此处删除尾随的新行字符;除非您试图打印字符串,否则不需要*/
字符串[strlen(string)-1]='\0';
printf(“Num是%d\n”,atoi(字符串));
返回0;
}
若并没有输入,或者只需输入或空格并输入,则打印的数字将为零,fgets()将不会等到输入有效数字


还可以检查一下为什么不应该使用gets

好的,您不了解scanf()的功能,它会扫描整个输入字符串并查找特殊字符,如%d、%f、%s,直到它没有得到字符串中的内容为止

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

只有在输入2个整数值时才能完成,如果按空格键,它不会计为整数值,因此将忽略它。

这是个坏主意@Enzo Ferber请澄清“在类型格式之前需要一个空格,以便忽略空白”。当然
scanf(“%d”,…)
scanf(“%d”,…)
同样扫描
int
@chux是的,我以为我已经删除了。意思是,你想忽略空输入(空格或换行)?如果你没有输入,这个代码输出0,这是您想要的吗?
scanf
无法按预期工作,因为
%d
跳过了前导空格字符。我切换到fgets(),它可以工作。我编译错误的代码,因此程序在我第一次尝试时仍然使用scanf。对于scanf()和fgets(),始终检查返回值(而不是参数值),以确保操作成功。我之前尝试过类似的代码。我只是没有意识到新代码没有被编译:(谢谢你的帮助!它可以工作!
string[strlen(string)-1]='\0';
在没有
'\n'
的情况下错误地截断。如果第一个字符是罕见的嵌入
'\0'
,这是未定义的行为。关于这一行,最好使用:
string[strlen(string)-1]='\0';
这在所有情况下都无法正常工作,原因有两个。1)如chux所述,如果没有换行符,则该行将被损坏。2)如果在windows/dos下运行,(其中换行符实际上是两个字符)这不会删除换行符,只会损坏它。建议使用以下内容:
char*offset=strstrstr(string,“\n”);if(NULL!=offset)*offset='\0';
@user3629249:同意。谢谢
ch
应该是
int
,因为
getchar
返回
int