#c
#c
Вопрос:
Я хочу прочитать inputtext.txt строка за строкой меняйте порядок слов в каждой строке в обратном порядке и распечатывайте их (ввод: привет, мир, вывод: привет, мир). С этим кодом весь мой вывод перепутан, и я получаю ошибку времени выполнения # 2, в которой говорится, что стек вокруг моего массива «string» поврежден. Я пытался сбрасывать строки на null после каждой итерации цикла while, но я все еще получаю ту же ошибку. Есть ли у кого-нибудь какие-либо предложения, чтобы избавиться от ошибки во время выполнения или помочь коду работать более плавно?
int main() {
FILE *inp,*outp; //file input and output
int i,wordcount; //define counter variables
int k = 0,j=0;
char string[200]; //define string to scan sentence into
char words[20][20]; //2D string for each word in the sentence
inp = fopen("inputtext.txt", "r");
outp = fopen("output.txt", "w");
if (inp == NULL) {
printf("File not found.n");
}
else {
while (!feof(inp)) {
fgets(string, 1000, inp);
printf("GOT SENTENCEn");
for (i = 0; string[i] != ''; i ) {
if (string[i] == ' ') {
words[k][j] = '';
k ;
j = 0;
}
else
{
words[k][j] = string[i];
j ;
}
}
words[k][j] = '';
wordcount = k;
for (i = wordcount; i >= 0; i--) {
printf("%s ", words[i]);
}
printf("nn");
}
}
return 0;
}
Комментарии:
1. Мы не можем сказать, что
words
такое или какоеj
илиk
имеет начальное значение, потому что ваш код неполон.2. Обновленный вопрос с полным кодом. Надеюсь, это поможет.
3. Можете ли вы сказать нам, какие входные данные вы предоставляете? Кроме того, почему вы устанавливаете значение
k
иj
равным нулю только один раз, когда они должны быть равны нулю при каждой попытке обработать строку?4. Входные данные представляют собой файл с предложением в каждой строке без знаков препинания. Я не уверен, как вам показать.
5. Ваш
string
массив может переполниться (длина 200), если выfgets
прочитаете строку длиннее 199 символов (нулевой байт), поскольку вы говорите ему прочитать до 1000 символов. Если это произойдет, ваш стек будет поврежден
Ответ №1:
следующий предлагаемый код:
- чисто компилируется
- правильно проверяет наличие ошибок
- корректно выводит сообщения об ошибках в
stderr
- выполняет желаемую функциональность
- правильно ограничивает максимальную длину входных данных
- предполагается, что ни одна строка во входном файле не превышает 199 символов
- минимизирует количество раз, когда вызывается функция:
strlen()
- фактически записывает перевернутые предложения в выходной файл
И теперь, предлагаемый код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
FILE *inp,*outp; //file input and output
int wordcount; //define counter variables
int k = 0;
int j = 0;
char string[200]; //define string to scan sentence into
char words[20][20]; //2D string for each word in the sentence
inp = fopen("inputtext.txt", "r");
if( !inp )
{
perror( "fopen to read: inputtext.txt failed" );
exit( EXIT_FAILURE );
}
outp = fopen("output.txt", "w");
if( !outp )
{
perror( "fopen to write: output.txt failed" );
// cleanup
fclose( inp );
exit( EXIT_FAILURE );
}
size_t strLength = strlen( string );
for (size_t i = 0; i < strLength; i )
{
// remove any trailing newline
string[ strspn( string, "n" ) ] = '';
printf("GOT SENTENCEn");
for (size_t i = 0; i < strlen(string); i )
{
if (string[i] == ' ')
{
words[k][j] = '';
k ;
j = 0;
}
else
{
words[k][j] = string[i];
j ;
}
}
words[k][j] = '';
wordcount = k;
for ( int i = wordcount; i >= 0; i--)
{
printf("%s ", words[i]);
fprintf( outp, "%s ", words[i] );
}
printf("nn");
fprintf( outp, "n" );
}
return 0;
}