Почему 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;
}

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

  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