最后一句话是失败......?

时间:2014-10-15 12:07:02

标签: c segmentation-fault

我对最后一个字有疑问,似乎错过了最后一步。

输入:

JXJIAA

输出:

lowercase: 0.00 uppercase: 77.78

什么时候应该是

lowercase: 0.00 uppercase: 100.00?

如果文本文件中有另一行,程序可以正常工作,但是我想让它在没有多余行的情况下工作,我想我与此有关:“while(line [x]!= 10); “但不知道该怎么办? 有什么方法可以改进这段代码。这是代码:

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

FILE *fr; 

int main (int argc, const char * argv[]){
    char line[1024];
    double uppercase = 0, lowercase = 0;
    int x = 0;
    fr = fopen ("PercenUpLow.txt", "rt");
    while(fgets(line, 1024, fr) != NULL){
        do{
            if ((line[x] >= 'A') && (line[x] <= 'Z')){
                uppercase += 1;
            }else if ((line[x] >= 'a') && (line[x] <= 'z')){
                lowercase += 1;    
            }
                x+=1;
            }while (line[x] != 10);
            printf("lowercase: %0.2f ", (lowercase / x) * 100);
            printf("uppercase: %0.2f \n", (uppercase / x) * 100);
            lowercase = 0;
            uppercase = 0;
            x = 0;
        }    
    return EXIT_SUCCESS;
}

示例:

输入:

HeLo

输出:

Uppercase: 50.00 Lowercase: 50.00

1 个答案:

答案 0 :(得分:0)

试试这个:

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

FILE *fr; 

int main (int argc, const char * argv[]){
  char line[1024];
  double uppercase = 0, lowercase = 0;
  int x = 0;
  fr = fopen ("PercenUpLow.txt", "rt");
  if (fr == NULL) {
    printf ("Can't open file") ;
    return EXIT_FAILURE ;
  }
  while(fgets(line, 1024, fr) != NULL) {
    do {
      if ((line[x] >= 'A') && (line[x] <= 'Z')){
        uppercase += 1;
      }else if ((line[x] >= 'a') && (line[x] <= 'z')){
        lowercase += 1;    
      }
      x+=1;
    } while (line[x] != '\n' && line[x] != 0);

    printf("lowercase: %0.2f ", (lowercase / x) * 100);
    printf("uppercase: %0.2f \n", (uppercase / x) * 100);
    lowercase = 0;
    uppercase = 0;
    x = 0;
  }    
  return EXIT_SUCCESS;
}

我更改了这一行:

     } while (line[x] != '\n' && line[x] != 0);

如果文件未被\n终止,那么最后一行读取也不会被\n终止(似乎很明显),并且您正在阅读比行结尾更远的行,未定义的行为。

我还测试文件是否可以正确打开。

您一定要学习如何使用调试器。