【问题标题】:One line is being skipped in file with isalpha()使用 isalpha() 在文件中跳过一行
【发布时间】:2013-04-09 20:31:49
【问题描述】:

我正在使用 isalpha() 来确定该行是否有字符,并且显示“90 1 0”行包含字母字符。

这里是相关代码

bool digitTest(char *test, int arysize)
{
int i;
for (i =0; i<arysize; i++)
{
    if ((isalpha(test[i])) != 0){

        return 0;
    }

    if (i==arysize)
        return 1;
            i++;
}
return 1;
}

这里叫

char buffer[4096] = {};

while(NULL!=fgets(buffer, sizeof(buffer), fp)){
    if (digitTest(buffer, 4096) == 0){

        printf ("contains alpha\n");
        continue;
    /*printing code if there is no alphabetic characters below, i do not believe it is  relevant*/

这是输出

1
1
1
contains alpha 
contains alpha
contains alpha 
25123.90
54321.23
6

输入

1
1
1
89 23.5 not a number
90 1 0
-5.25 not a number 10000
25123.90 54321.23 6

【问题讨论】:

  • 您是否在调试器中检查过哪些行被传递以及它们包含什么?
  • 你不是通过传入 4096 来循环超过缓冲区的末尾来测试函数吗?它可能正在访问有有效字符的内存
  • @bash.d 我不知道该怎么做对不起。
  • @75inchpianist 我应该让缓冲区更大吗?
  • 不,您应该检查整个缓冲区,或者检查缓冲区直到您遇到终止的空字符。以先到者为准。

标签: c ctype


【解决方案1】:

代码有几个问题:

  • 您不应该检查所有缓冲区。检查缓冲区直到\0。因为fgets的输出是一个C风格的字符串。

  • 第二个问题是函数digitTest 中的一个额外i++。你应该删除它。

  • 你不再需要arysize了。

改用这个digitTest 函数

int digitTest(char *test)
{
  int i;
  for (i=0; test[i] && test[i] != '\n'; i++)
  {
     if (isalpha(test[i]) != 0)
        return 0;
  }
  return 1;
}

(可能有小bug,我没测试过)

然后这样称呼它:

while( fgets(buffer, sizeof(buffer), fp) ) {
    if (!digitTest(buffer)) {
        printf ("contains alpha\n");
        continue;
    }
}

【讨论】:

  • 建议在遇到\n 时停止处理,因为fgets() 会将其添加到正在填充的缓冲区中(并且不再需要arysize)。
【解决方案2】:

看起来您可能正在访问内存中包含字符的位置,请将您的代码更改为

char buffer[4096] = {};
memset(buffer, 0, 4096);

while(NULL!=fgets(buffer, sizeof(buffer), fp)){
if (digitTest(buffer, strlen(buffer)) == 0){ //get actual length of buffer

    printf ("contains alpha\n");
    continue;

编辑

为了使您的代码不响应\n\r

bool digitTest(char *test, int arysize)
{
int i;
for (i =0; i<arysize; i++)
{
    if( test[i] == '\r' || test[i] == '\n')
        return 1;
    if ((isalpha(test[i])) != 0){

        return 0;
    }

    if (i==arysize)
        return 1;

}
return 1;
}

【讨论】:

  • 这将失败,因为fgets() 将换行符读入buffer
  • @hmjd 你的意思是在\0之后?
  • 不,在\0 之前。 fgets() 在它填充的缓冲区中包含换行符。
  • 好的,但是\n\r 都不能显示,所以出了什么问题?
  • \r\n 都不是 isalpha()
猜你喜欢
  • 2011-08-02
  • 2018-06-12
  • 2020-12-15
  • 1970-01-01
  • 2012-10-09
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
  • 2011-12-21
相关资源
最近更新 更多