2013-10-04 2 views
2

Я начинающий программист, берущий класс, и я не могу заставить мои строки вывода печатать с пробелами между словами. Вот мой код ниже. Предполагается, что я беру строку, которую я ввожу, и либо изменяю все кепки, либо все строчные буквы, как я указываю при запуске программы. Если я помещаю МОЙ КОД, НЕ РАБОТАЕТ, он выводит mycodedoesnotwork. Почему он удаляет пробелы?Программа удаляет пробелы в строке uninteded

1 #include <stdio.h> 
2 #include <assert.h> 
3 #include <stdlib.h> 
4 #include <string.h> 
5 
6 
7 int shout(char * msgIn, char * msgOut) { 
8 
9   if (!msgIn || !msgOut) 
10     return -1; 
11   while (*msgIn != '\0') { 
12     if ('a' <= *msgIn && *msgIn <= 'z') 
13       *msgOut = *msgIn + ('A' - 'a'); 
14     else 
15       *msgOut = *msgIn; 
16     msgIn++; 
17     msgOut++; 
18   } 
19   *msgOut = '\0'; 
20 
21   return 0; 
22 } 
23 
24 
25 int whisper(char const * msgIn, char * msgOut) { 
26   if (!msgIn || !msgOut) 
27     return -1; 
28   while (*msgIn != '\0') { 
29     if ('A' <= *msgIn && *msgIn <= 'Z') 
30       *msgOut = *msgIn + ('a' - 'A'); 
31     else 
32       *msgOut = *msgIn; 
33     msgIn++; 
34     msgOut++; 
35   } 
36   *msgOut = '\0'; 
37   return 0; 
38 } 
39 
40 int main(int argc, char ** argv) { 
41   char in[128], out[128]; 
42   int i; 
43   for (i = 1; i < argc; i++) { 
44     if (strcmp("-w", argv[i]) == 0) 
45       while (scanf("%s", in) != EOF) { 
46         whisper(in, out); 
47         printf("%s", out); 
48       } 
49     else if (strcmp("-s", argv[i]) == 0) 
50       while (scanf("%s", in) != EOF) { 
51         shout(in, out); 
52         printf("%s", out); 
53       } 
54   } 
55   printf("\n"); 
56   return 0; 
57 } 

~

~

+0

Argh! Удалите номера строк из кода. – Sadique

+0

Я решил, что это поможет, поэтому кто-то может указать, к какой строке они относятся, но я хочу отметить ваш запрос. –

+0

Что вы скажете scanf? –

ответ

2

В scanf вызовы чтения в только слов (без пробелов), и вы не добавляете пространства обратно в при выводе ваших строк.

Если вы не возражаете косое пространства, просто изменить линии 47 и 52 для printf("%s ", out)

+0

Спасибо за исправление Оливера. Это будет сделано для моего задания позднее сегодня, но я проверю свою версию scanf и переделаю ее другим подходом. –

1

while (scanf("%s", in) != EOF) ==>scanf() принимает ввод до места и отправить работать

, а затем в следующей итерации снова принимает слово после пробела.

Вместо этого вы должны использовать fgets().

+0

Я рассмотрю это. Книга еще не прошла через fgets(), поэтому подразумевается, что она должна делать это с помощью scanf. Я займусь этим. Спасибо за совет. –

+0

его до вас. теперь просто просмотрите ссылку. Там вы найдете реализацию. – Gangadhar

0

Это не проблема с вашими shout() или wisper() функциями, но проблема с scanf().

При указании %s для чтения строки, строка будет заканчиваться на любых пробельных символов - пробел, табуляция и т.д.

И что не будут включены в строку. Таким образом, пространство, которое вы вводите между строками, не сохраняется в переменной in.

Возможно, вы захотите подумать о другом подходе к решению этого вопроса.

+0

Это единственный способ, которым книга показала нам, чтобы читать строки и использовать их, поэтому это мой единственный подход. Я посмотрю на fgets(). Эта книга немного не хватает. Спасибо за ответ. –

0

пространства является строка терминатором для scanf() и scanf() не включает его в приобретаемой строке. man 3 scanf

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

  • Нет связанных вопросов^_^