2014-05-09 2 views
1

Я пытаюсь передать строку в функцию в C. Эта строка будет введена пользователем, а затем передана функции для записи в текстовый файл. Iknow это кажется очень простой, но я только учусь C.Передача строки в функцию

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

void read() { 

     char text[50][30],buffer[150]; 

     int i=0; 
     FILE *file_in; 
     file_in=fopen("test.txt","r"); 

     if (file_in == NULL) { 
       printf("Error opening file\n"); 
     } 

     while (fgets(buffer,150,file_in)) { 
       strcpy(text[i],buffer); 
       printf("line %d: %s\n",i,text[i]); 
       i++; 
     } 

     getchar(); 

     fclose(file_in); 
} 

void write(char str[]) 
{ 
     FILE *file_in; 
     file_in=fopen("test.txt","a"); 

     if (file_in == NULL) { 
       printf("Error opening file\n"); 
     } 

     //write to the file 
     fprintf(file_in, "\n%s", str); 
//  fputs(str, file_in); 

     fclose(file_in); 
} 

int main() 
{ 
     read(); 

     char msg[50]; 

     printf("Enter some text: "); 
     puts(msg); 

     write(msg); 

     return 0; 
} 

Он пишет в файл, но он пишет странные символы, а не то, что я на самом деле типа. Что я делаю не так?

+0

Что делает это написать? Что-то вроде 0x049569 ...? – OMGtechy

+0

Я пишу что-то вроде коробки с множеством символов. –

+0

Пожалуйста, напишите, что он печатает в вашем вопросе – OMGtechy

ответ

-1

Вот решение:

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

int read() { 

     char text[50][30],buffer[150]; 

     int i=0; 
     FILE *file_in; 
     file_in=fopen("test.txt","r"); 

     if (file_in == NULL) { 
       printf("Error opening file\n"); 
     } 

     while (fgets(buffer,150,file_in)) { 
       strcpy(text[i],buffer); 
       printf("line %d: %s\n",i,text[i]); 
       i++; 
     } 

     // getchar();why you were using this? 

     fclose(file_in); 
     // return 0; 
} 

void write(char str[]) 
{ 
     FILE *file_in; 
     file_in=fopen("test.txt","a"); 

     if (file_in == NULL) { 
       printf("Error opening file\n"); 
     } 

     //write to the file 
     fprintf(file_in, "\n%s", str); 
//  fputs(str, file_in); 

     fclose(file_in); 
} 

int main() 
{ 
     char msg[50]; 
     read(); 



     printf("Enter some text: "); 
     // getchar(); 
     gets(msg);//It reads in msg 

     write(msg); 

     return 0; 
} 
+0

Благодарим за решение –

+0

Ваш прием. Я не представил изменений. Вы должны пройти через другие ответы, а использование donot вместо этого использует fgets. – jahan

+1

Недопустимый избиратель этого ответа должен оставить причину. то есть плакат является довольно новым для SO, дать ему представление о том, как улучшить ответ. – ryyker

0

Прежде всего: не вызывайте свои функции read() и write() - выберите что-то более конкретное. Имена функций read() и write() уже используются системой для низкоуровневых файловых операций, и их само определение может вызвать неожиданное поведение.

Во-вторых: вы никогда не инициализируете содержимое переменной msg или не читаете никаких данных в нем, поэтому его содержимое будет случайным. (Помните, что puts() печатает данные, он ничего не читает.)

2

Похоже, вы путаете gets с puts. puts записывает строку на консоль. gets читает строку с консоли. Выключите их, и ваша программа должна работать.

Компилятор Microsoft часто предостерегает от небезопасных или устаревших функций, таких как gets. Вместо этого вы можете использовать fgets, так как он не позволяет переполнять буфер.

Вот пример:

fgets(msg, 50, stdin); 

или

fgets(msg, sizeof(msg), stdin); 
+4

вы просто посоветовали кому-то использовать 'gets'? –

+0

Я устал от использования gets.It работал, но он говорит, что он устарел. Есть ли способ лучше? –

+0

@flaco 'fread' является гораздо более целесообразной функцией – tay10r

0

Когда вы пишете char msg[50];, она содержит неопределенные значения. Это не инициализация нуля или что-то еще.

Строка puts(msg); записывает этот мусор, а затем write(msg); записывает этот мусор в файл.

Возможно, у вас есть код для ввода текста после printf и до puts.

NB. В вашей функции read() (которую вы еще не вызываете) вы должны сделать размер буфера fgets в соответствии с шириной вашего массива, и вы должны убедиться, что вы не сбегаете с конца вашего массива, если файл имеет много строк.

Также было бы разумно назвать ваши функции чем-то иным, чем read и write, потому что в среде POSIX уже есть функции с таким именем, которое может столкнуться.

Смежные вопросы