Почему 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, что означает успешное выполнение программы.