Почему printf добавляет символы в выводе? - C (СИ)
Формулировка задачи:
Программа меняет соседние буквы в словах.
Ниже код, не знаю где ошибка. Вывожу слова с помощью printf. То в конце слова прибавляет ненужную букву, то в начале следующего слова пишет последнюю букву предыдущего. Просьба помочь.
Снизу результат работы.
// labka1.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main(void){ setlocale(LC_ALL, "Russian"); char str[80]; char **words = NULL, *p = NULL; int letter; printf("%s", "Введите строку: "); int j = 0; while ((letter = getchar()) != '\n') { str[j] = letter; j++; } str[j] = NULL; int i, cnt = 0; for ( p = strtok(str, " "); p != NULL; p = strtok(NULL, " ") ) { if ( ( words = (char**)realloc(words, sizeof(char*) * (cnt + 1)) ) == NULL ){ printf("No memory to new word!\n"); exit(1); } if ( ( words[cnt] = strdup(p) ) == NULL ){ printf("Can't duplicate word!\n"); exit(1); } ++cnt; } int k; printf("Количество слов: %d\n", cnt); int z; char t[80]; char v; //printf("Введённая строка %s", str); for ( i = 0; i < cnt; i++ ) { strcpy(t,words[i]); //k = strlen(t); for (z = 0; z <= (strlen(t)); z++) { v=t[z]; t[z]=t[z+1]; printf("%c",t[z+1]); t[z+1]=v; ++z; printf("%c",v); } } for ( i = 0; i < cnt; ++i ){ if ( words[i] != NULL ){ free(words[i]); words[i] = NULL; } } free(words); words = NULL; system("pause"); exit(0); }
Решение задачи: «Почему printf добавляет символы в выводе?»
textual
Листинг программы
#include <stdio.h> #include <string.h> char * swap_letters(char * wrd) { size_t i = 1, len = strlen(wrd); while (i < len ) { char t = wrd[i - 1]; wrd[i - 1] = wrd[i]; wrd[i] = t; i += 2; } return wrd; } #define DELIM " \t\n" int main(void) { char buf[BUFSIZ]; while ( printf("String: ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' && printf("Result: ") ) { char * w = strtok(buf, DELIM); while ( w ) { printf("%s ", swap_letters(w)); w = strtok(NULL, DELIM); } printf("\n"); } return 0; }
Объяснение кода листинга программы
- В данном коде используется функция
swap_letters
, которая меняет местами две буквы в строке. - В функции
main
создается буферbuf
для чтения строки с помощьюfgets
. - В цикле
while
происходит вывод строки с помощьюprintf
и чтение строки с помощьюfgets
. - Строка разбивается на слова с помощью
strtok
иDELIM
(пробел, табуляция, новая строка). - Каждое слово обрабатывается функцией
swap_letters
и выводится с помощьюprintf
. - После обработки всех слов выводится символ новой строки
'\n'
с помощьюprintf
. - Цикл
while
продолжается до тех пор, пока пользователь не введет пустую строку. - В конце программы возвращается значение 0, что означает успешное выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д