Почему printf добавляет символы в выводе? - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Программа меняет соседние буквы в словах. Ниже код, не знаю где ошибка. Вывожу слова с помощью printf. То в конце слова прибавляет ненужную букву, то в начале следующего слова пишет последнюю букву предыдущего. Просьба помочь. Снизу результат работы.
Листинг программы
  1. // labka1.cpp: определяет точку входа для консольного приложения.
  2. //
  3. #include "stdafx.h"
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <locale.h>
  8.  
  9. int main(void){
  10. setlocale(LC_ALL, "Russian");
  11. char str[80];
  12. char **words = NULL, *p = NULL;
  13. int letter;
  14. printf("%s", "Введите строку: ");
  15. int j = 0;
  16. while ((letter = getchar()) != '\n')
  17. {
  18. str[j] = letter;
  19. j++;
  20. }
  21. str[j] = NULL;
  22. int i, cnt = 0;
  23. for ( p = strtok(str, " "); p != NULL; p = strtok(NULL, " ") )
  24. {
  25. if ( ( words = (char**)realloc(words, sizeof(char*) * (cnt + 1)) ) == NULL ){
  26. printf("No memory to new word!\n");
  27. exit(1);
  28. }
  29. if ( ( words[cnt] = strdup(p) ) == NULL ){
  30. printf("Can't duplicate word!\n");
  31. exit(1);
  32. }
  33. ++cnt;
  34. }
  35. int k;
  36. printf("Количество слов: %d\n", cnt);
  37. int z;
  38. char t[80];
  39. char v;
  40. //printf("Введённая строка %s", str);
  41. for ( i = 0; i < cnt; i++ )
  42. {
  43. strcpy(t,words[i]);
  44. //k = strlen(t);
  45. for (z = 0; z <= (strlen(t)); z++)
  46. {
  47. v=t[z];
  48. t[z]=t[z+1];
  49. printf("%c",t[z+1]);
  50. t[z+1]=v;
  51. ++z;
  52. printf("%c",v);
  53. }
  54. }
  55. for ( i = 0; i < cnt; ++i ){
  56. if ( words[i] != NULL ){
  57. free(words[i]);
  58. words[i] = NULL;
  59. }
  60. }
  61. free(words);
  62. words = NULL;
  63. system("pause");
  64. exit(0);
  65. }

Решение задачи: «Почему printf добавляет символы в выводе?»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. char * swap_letters(char * wrd) {
  5.     size_t i = 1, len = strlen(wrd);
  6.    
  7.     while (i < len ) {
  8.         char t = wrd[i - 1];
  9.         wrd[i - 1] = wrd[i];
  10.         wrd[i] = t;
  11.         i += 2;
  12.     }
  13.    
  14.     return wrd;
  15. }
  16.  
  17. #define DELIM " \t\n"
  18.  
  19. int main(void) {
  20.     char buf[BUFSIZ];
  21.    
  22.     while ( printf("String: ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' && printf("Result: ") ) {
  23.         char * w = strtok(buf, DELIM);
  24.        
  25.         while ( w ) {
  26.             printf("%s ", swap_letters(w));
  27.             w = strtok(NULL, DELIM);
  28.         }
  29.        
  30.         printf("\n");
  31.     }
  32.    
  33.     return 0;
  34. }

Объяснение кода листинга программы

  1. В данном коде используется функция swap_letters, которая меняет местами две буквы в строке.
  2. В функции main создается буфер buf для чтения строки с помощью fgets.
  3. В цикле while происходит вывод строки с помощью printf и чтение строки с помощью fgets.
  4. Строка разбивается на слова с помощью strtok и DELIM (пробел, табуляция, новая строка).
  5. Каждое слово обрабатывается функцией swap_letters и выводится с помощью printf.
  6. После обработки всех слов выводится символ новой строки '\n' с помощью printf.
  7. Цикл while продолжается до тех пор, пока пользователь не введет пустую строку.
  8. В конце программы возвращается значение 0, что означает успешное выполнение программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.071 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут