как мне перебирать массив символов, передаваемый функции, и возвращать количество символов

#c #readline

#c #строка чтения

Вопрос:

 #include "Definition.h"
#include <stdio.h>
#include "ExternalVar.h"
#include <stdlib.h>
#include <string.h>

extern int Readline(),CountWord(),CountsUpdate();


char Line[MaxLine];  /* one line from the file */


int NChars = 0,  /* number of characters seen so far */
    NWords = 0,  /* number of words seen so far */
    NLines = 0,  /* number of lines seen so far */
    LineLength;  /* length of the current line */ 

int wc = 0,
    lc = 0,
    cc = 0,
    tc = 0;


int i;

main(int argc, char *argv[])  
{
    FILE *fp;
    fp= fopen(argv[1],"r");
    if (fp) 
    {
        while (i=fscanf(fp,"%s",Line)!=EOF)
        ///printf("%s n",Line);
        cc=Readline(Line);
        printf("%d n",cc);
        fclose(fp);


    }
    return 0;  
}
  

Это моя основная функция, я передаю строку массива символов[] в функцию Readline (строка), и я хочу, чтобы она возвращала количество символов в массиве.

Вот функция Readline.c . Независимо от того, какой текстовый файл я использую в качестве аргумента, я продолжаю получать 84 в качестве возвращаемого значения. Не уверен, что я делаю неправильно или правильно, так как я новичок в программировании на языке Си. Пожалуйста, помогите.

 #include "Definition.h"
#include "ExternalVar.h"
#include <stdio.h>



int Readline(char *Line)
{   
int i;


for (i = 0; Line[i] == 'n' ; i  )
{

return i;
}
}
  

Вывод выглядит следующим образом

taj@taj:~/Desktop/2014_Summer_CIS5027_Asg2$ gcc Main.c Readline.c taj@taj:~/Desktop/2014_Summer_CIS5027_Asg2 $ ./a.out b.txt

84

Комментарии:

1. Line[i] == 'n' : неправильное условие. Он записывает условие для продолжения цикла. и return i; перейти к циклу after.

2. хорошо, я переместил строку [i] == ‘n’ после цикла, но теперь она возвращает значение 1. Чем мне заменить условие? #включить «Definition.h» #включить «ExternalVar.h» #включить <stdio.h> int Readline(char *Line) { int i; for (i = 0; i != 0 ; i ) {i ; return *Line; } Строка[i] == ‘n’; }

3. вы неправильно поняли, что я сказал. я публикую пример кода.

Ответ №1:

 int Readline(char *Line){
    int i;
    for (i = 0; Line[i] != '' ; i  )//newline is not included in the Line. Because read by fscanf(fp,"%s",Line)
        ;

    return i;
}
  

Ответ №2:

У вас мало проблем:

1) Вы, вероятно, хотите проверять, пока не нажмете n . Таким образом, условие действительно должно быть:

 for (i = 0; Line[i] != 'n' ; i  )
  

2) Ваш ввод может не содержать n . Поэтому вам также следует проверить, достигли ли вы конца строки:

 for (i = 0; Line[i] amp;amp; Line[i] != 'n' ; i  )
  

3) Что делать, если первый символ находится n в Line ? Он вообще не войдет в цикл, и в этом случае вы ничего не возвращаете. Итак, вы должны инициализировать i=0 и вернуть его. Вы могли бы переписать функцию как:

 int Readline(char *Line)
{   
int i = 0;

  for (i = 0; Line[i] amp;amp; Line[i] != 'n' ; i  )
  {
  ;
  }

return i;
}
  

4) fscanf() with %s format не читается n , даже если ваш входной файл содержит его. Вы, вероятно, хотите использовать fgets() для чтения, который читает n символы:

 while (fgets(Line, sizeof Line, fp)) {
  ...
}
  

5) функция main() должна возвращать int : int main(int argc, char *argv[]) {... }

Комментарии:

1. Хорошо, я изменил Main на реализацию fgets вместо этого и попытался использовать опубликованный вами код, но он каждый раз возвращает 0, независимо от того, какой текстовый файл я ввел в аргумент.

2. Это break меняет логику. Попробуйте сделать это без break инструкции в цикле for, как в ответе сейчас.

3. Я не использовал оператор break. Я использовал то, что вы опубликовали.

4. хм … вы Line[i] != также использовали n` в условии цикла?

5. хорошо, это то, что я сделал int Readline(char *Line) { int i = 0; for (i = 0; Строка [i] amp;amp; Строка [i] != ‘n’ ; i ) { } return i; } Я получил обратно 15, которые включают символыв строке и пробелах. Однако, когда я пытаюсь использовать другой текстовый файл, я получаю 0.