#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.