Почему 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, что означает успешное выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д