C语言 从字符串获取整数

w8ntj3qf  于 2023-04-11  发布在  其他
关注(0)|答案(5)|浏览(160)

我有一些代码,在while循环中读取name 1形式的字符串,然后我必须提取整数值以打印yes或no。但是当我尝试使用sscanf执行此操作时,它仅在循环结束后才向目标整数提供值。

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

int main() {
    char a[20];
    int p = 0;
    while (scanf("%s", a)) {
        sscanf(a, "%d", &p);
        if (p != 0) {
            printf("yes");
        } else {
            printf("no");
        }
    }
    return 0;
}

即使我引入的字符串的整数大于1,程序也总是打印no
我尝试用printfs计算输出,当我执行它时,我看到它给出了以下输出:

printf("%d", p);

对于输入:

name 1

它打印:

0no1yes

正如我所说的,它首先得到的整数为0,在输入if后,它变成了1

i5desfxk

i5desfxk1#

scanf的调用中

while(scanf("%s",a)) {

转换说明符s只允许读取由空格分隔的文本。也就是说,如果您将输入

name 1

则第一次调用scanf将只读取文本"name",并且在循环的下一次迭代中,调用scanf将读取文本"1",其确实可以被转换为整数。
在调用scanf时需要使用另一个转换说明符。
和while循环中的条件

while(scanf("%s",a)) {

事实上,你有一个无限循环。
你的程序也包含了多余的include指令。
程序可以看起来像下面这样。

#include <stdio.h>

int main( void ) 
{
    char a[20];

    while ( scanf(" %19[^\n]",a ) == 1 ) 
    {
        int p = 0;

        sscanf( a,"%*s%d", &p );

        if ( p ) 
        {
            puts( "yes" );
        }
        else 
        {
            puts( "no" );
        }
    }

    return 0;
}
qlzsbp2j

qlzsbp2j2#

1.始终格式化您的代码。不是为我们-为您自己
1.检查扫描结果
1.不要使用scanf读取行-始终使用fgets

int main(void)
{
    char a[20];
    int p=0;
    while(fgets(a, sizeof(a), stdin))
    {
        if(sscanf(a,"%d",&p) != 1) 
        {
            printf("\nNo no no!!!!\n");
            continue;
        }
        if(p!=0)
        {
            printf("yes\n");
        }
        else{
        printf("no\n");
        }
    }
    return 0;
}

https://godbolt.org/z/dcqc47vh1

nsc4cvqm

nsc4cvqm3#

当您使用scanf()从标准输入流读取输入值时,它会将输入值存储在缓冲区中,直到读取所有预期的输入值。如果您没有使用缓冲区中的所有输入值,它们可能会留在缓冲区中,并可能导致程序出现问题。因此,最好使用fgets()方法从输入流读取数据。

#include <stdio.h>

int main(){
    char inpt[20];
    char str[20];
    int val=0;
    while(1){
        fgets(inpt, 20, stdin);
        sscanf(inpt, "%s %d", str, &val);
        if(val!=0){
            printf("yes\n");
        }
        else{
            printf("no\n");
        }
    }
    return 0;
}
nnsrf1az

nnsrf1az4#

你几乎有正确的方法:你应该用fgets()读取一行输入,然后用sscanf()解析它以提取整数。
正如编码的那样,使用scanf("%s", a)阅读既不正确又有风险:

  • 不正确,因为只读取一个字,name,然后在下一个循环中读取1
  • 因为任何超过19个字符的单词都会导致缓冲区溢出。

下面是一个简单的替代方案:

#include <stdio.h>

int main(void) {
    char a[100];

    while (fgets(a, sizeof a, stdin)) {
        int p;
        if (sscanf(a, "%*s%d", &p) == 1 && p != 0)
            puts("yes");
        else
            puts("no");
    }
    return 0;
}

但是请注意,上面的代码将接受潜在的无效行,例如Hello 1 world!1 2 3

ugmeyewa

ugmeyewa5#

您的输入是“name1”,所以第一次读取sscanf不是“成功的”,因为它首先读取的是“name”,而且它也不是一个整数,正如建议的那样,尝试检查您有多少次成功的读取,或者(如果您信任输入)尝试使用

sscanf("%s %d", a, &p);

现在sscanf将知道跳过字符串并读取您想要的整数。

相关问题