gpt4 book ai didi

c - C 中重定向标准输入的输入验证

转载 作者:行者123 更新时间:2023-11-30 18:00:55 26 4
gpt4 key购买 nike

我正在尝试用 C 编写一个程序,用于检测 CSV 格式的作业,例如。十进制commadedecimal。并给出文件是否符合所需格式的输出。我尝试使用来自 stdin 的各种输入并使用 isdigit 等,但没有成功。我是一个 super 菜鸟,之前几乎没有做过任何 C 编程,我尝试使用 regexc 但无法弄清楚使用它的语法。

#include <ctype.h>
#include <stdio.h>
const char EOL = '\n';

int cbreak(void);
int check_dig(void);
int value =1;
char c;

int main()
{

while((scanf("%c" ,&c)) !=EOF&& value !=0)
check_dig();

printf("\n%d\n",value);
}

int check_dig()
{
if (c == EOL)
scanf("%c", &c);
if (c == isdigit)
scanf("%c", &c);
else if (c == ',')
scanf("%c", &c);
else value = 0;
}

谢谢大家,我现在已经到了这个阶段,但对如何完成感到困惑,我需要根据验证打印 1 或 0,并且我想按照建议使用返回值来执行此操作。

#include <ctype.h>
#include <stdio.h>

int check_digit(int);
int check_comma(int);
int skip_char(int);
int main()
{
int c;

while ((c = getchar()) !=EOF)
if (check_digit(c))
skip_char(c);
else if (check_comma(c))
skip_char(c);
else return 0;
}

int check_digit(int c)
{
if (isdigit(c))
return 1;
else return 0;
}

int check_comma(int c)
{
if (c == ',')
return 1;
else return 0;
}

int skip_char(int c)
{
c = getchar(); // will this skip 2 chars as i have a while loop that has c=getchar()??
return c;
}

最佳答案

首先,我建议不要使用如此庞大的全局变量列表。在函数中使用参数并从函数返回值。

第二个isdigit 不会那样工作。它接受一个参数并返回 true 或 false。 isdigit

此外我会使用 getchar通过 scanf。

你的int check_dig()函数有点奇怪。您继续读取函数内的字符。

我也许会做这样的事情:

int valid_csv(char c)
{
if (isdigit(c))
return 1;
/* etc. other checks */
if all fails
return 0;
}

int main(void)
{
int c;

/* read chars into c and call fun by something like */
valid_svc(c);

return 0;
}
<小时/>

编辑:根据经验。一个函数应该做一件事,而且只做一件事,而且要做好。函数的名称应该反射(reflect)它的作用。

<小时/>

编辑2:

您不需要“跳过字符”。在新代码中,它的方式是跳过所有其他字符。

即:

文件:12,33,66,14

在你的代码中你会得到

  • c = getchar => c == 1
  • c 是数字
    • getchar => 您读了 2 个(但从未验证过)
  • c = getchar => c == ,
  • c 是逗号
    • getchar => 您读了 3 个(但从未验证过)
  • ...

进一步;我知道我写了“一个函数应该做一件事”——但不是字面意思。即您的新 check_digit 是多余的。直接使用isdigit。如果 csv 中有 float ,则必须扩展或使用不同的方法。

举例说明;比在这里写更容易:)

#include <ctype.h>
#include <stdio.h>

int valid_csv_chr(int);
int valid_csv(); /* guess naming could be better. */

int main(void)
{
if (valid_csv())
puts("1");
else
puts("0");

return 0; /* Main should return 0 if there was no "crash" scenario etc.
* You could also return i.e. 1 if the file is not validated as csv.
* Do not think of 1 and 0 as boolean true / false here. */
}

int valid_csv()
{
int c;

while((c = getchar()) !=EOF) {
if (!valid_csv_chr(c)) {
return 0;
}
}

return 1;
}

int valid_csv_chr(int c)
{
if (isdigit(c))
return 1;
if (c == ',')
return 1;
if (c == '\n')
return 1;
/* add checks for space etc. */
return 0;
}
<小时/>

编辑3:

代码结构就像语言本身一样需要学习。这是通过实践和写作来学习。人们意识到重新构造代码是必要的,这种情况时常发生——但是在编写之前思考得越多,首先制作一个简单的结构并扩展它,等等,这是可以避免的。

无论如何;练习,练习,练习。并始终牢记这些主题。

即使它“看起来”很简单,但事实并非如此。我认为书籍、教程、类(class)等通常很少关注这个主题。全部都是关于 forif、函数等,而很少涉及如何将它们拼接成一个好的方式。

拆分代码有几个优点。

  • 这使得它更具可读性。
  • 它使维护变得更加容易。
  • 错误和错误通常可以通过修复一个小函数而不是一个大函数来修复。
    • 在某些情况下,我见过数千行代码,其中有一些存在错误的怪物函数。通过调整来修复它几乎是不可能的,完全重写是唯一的选择。
  • 优化只完成一项任务且规模不大的函数会更容易。
  • 使用较小的函数更容易扩展以覆盖更多场景。
    • 例如在您的程序中说。您可以将其更改为“验证数据文件”,涵盖 csv、制表符分隔、对齐等。

最后一点其实是我写作时经常想到的一个方式; “我应该如何最好地实现这段代码,以便将来如果我想扩展它以覆盖更多场景,也可以轻松完成。”

我自己用this作为用 C 语言编写时的基础,并结合我在 K & R 的 ANSI C 书++ 中学到的东西。例如,参见有关 functions 的内容。 .

还有;严格的编码风格使其更易于阅读和维护。我很大程度上使用了上面文档中描述的内容。这不是法律,但意识到这一点会使编码生活变得更加简单。

关于c - C 中重定向标准输入的输入验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10133872/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com