2015-11-21 2 views
1

Мне нужно изменить вторую букву с предпоследним письмом на слово с более чем тремя буквами. Пример у меня есть эта строка: Alex являются просто
Результат должен быть: Aelx являются Мри
Но я получаю это когда я запустить свою программу: Axel` AlerОбмен 2-го символа со следующим последним

Это код:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 
    int i,n,j=0; 
    char text[81],cuv[44],l; 

    printf("Introduce-ti textul:"); 
    gets(text); 

    for(i=0;i<strlen(text);i++) 
    { 
     if(text[i] != 32) { 
      cuv[j]=text[i]; 
      j += 1; 
     } else { 
      n = strlen(cuv) - 1; 

      l= cuv[1]; 
      cuv[1]=cuv[n-1]; 
      cuv[n-1]=l; 

      printf("%s ",cuv); 
      strcpy(cuv,""); 
      j=0; 
     } 
    } 

    return 0; 
} 
+0

Я должен «* поменять 2-й символ следующим последним» - это более простой способ формулировки вопроса. –

+1

FIrst разделяет полное предложение словом и после этого проверяет каждую длину слова больше трех, а затем заменяет caharcter. –

+4

'strlen (cuv) - 1;' не будет работать - 'cuv' не заканчивается нулем. – Downvoter

ответ

0

Во-первых, вы не хотите использовать gets. Он был удален из стандартной библиотеки, потому что он был небезопасным, вместо этого используйте fgets. При этом все, что вам нужно сделать, это токенизировать вашу входную строку в слова, а затем, если слово больше 3 символов, замените второй и следующий символы последними. Один из способов будет:

#include <stdio.h> 
#include <string.h> 

#define MAXS 256 
#define MAXW 64 

int main (void) { 

    size_t len; 
    char str[MAXS] = {0}; 
    char word[MAXW] = {0}; 
    char *p = NULL; 

    fgets (str, MAXS, stdin); /* read input from stdin */ 

    /* tokenize string */ 
    for (p = strtok (str, " "); p; p = strtok (NULL, " \n")) 
    { 
     strncpy (word, p, MAXW - 1); /* copy token to word */ 

     if ((len = strlen (word)) > 3) /* if word > 3 */ 
     { 
      char tmp = word[1];   /* swap 2nd & next to last */ 
      word[1] = word[len-2]; 
      word[len-2] = tmp; 
     } 
     printf ("%s ", word);   
    } 
    putchar ('\n'); 

    return 0; 
} 

Использование/выход

$ printf "Alex are mere\n" | ./bin/swap2nd 
Aelx are mree 

или если вы хотите, чтобы ввести текст:

$ ./bin/swap2nd 
Alex are mere 
Aelx are mree 

Второй метод с использованием Start/End указателей

Вы можете также изменить исходную строку готовую Ве fgets на месте, используя не более чем запуска указателя (p ниже) и конец указателя (ep ниже), чтобы работать ваш путь вниз строки символ за символом, останавливаясь каждый раз конец указатель указывает на space, tab или newline, а затем, используя разницу между начала и конечных указателей, чтобы проверить длину слова и выполнять своп символов, если длина больше 3 символы. Вы можете работать по каждой версии и сравнить:

#include <stdio.h> 

#define MAXS 256 

int main (void) { 

    char str[MAXS] = {0}; 
    char *p = NULL; 
    char *ep = NULL; 

    fgets (str, MAXS, stdin); /* read input from stdin */ 

    p = ep = str; 

    while (*ep) /* for each char, if a space, tab or newline */ 
     if (*ep == ' ' || *ep == '\t' || *ep == '\n') { 
      if ((ep - p) > 3) {   /* if length > 3 */ 
       char tmp = *(p + 1); /* swap chars */ 
       *(p + 1) = *(ep - 2); 
       *(ep - 2) = tmp; 
      } 
      p = ++ep; /* set p to next word */ 
     } 
     else 
      ++ep; 

    printf ("%s\n", str); 

    return 0; 
} 

Использование/выход

$ ./bin/swap2nd2 
Alex are mere 
Aelx are mree 

Какой подход вам сделать выбор между этими двумя методами, а также методом, публикуемую Влад, во многом дело вкуса/выбора. Все они являются действительными и представляют собой просто другой способ выполнения одного и того же. Дайте мне знать, если у вас есть вопросы.

0

Попробуйте следующий подход

#include <stdio.h> 

int main(void) 
{ 
    char s[] = "Alex Chiurtu"; 
    char t[sizeof(s)]; 

    size_t i = 0, j = 0; 

    do 
    { 
     t[i] = s[i]; 
     if (s[i] != ' ' && s[i] != '\t' && s[i] != '\0') 
     { 
      ++j; 
     } 
     else if (j != 0) 
     {    
      if (j > 3) 
      {     
       char c = t[i-j + 1]; 
       t[i-j+1] = t[i-2]; 
       t[i-2] = c; 
      } 

      j = 0; 
     } 
    } while (s[i++]);   


    puts(s); 
    puts(t); 

    return 0; 
} 

Выход программы

Alex Chiurtu 
Aelx Ctiurhu 

Примите во внимание, что функция gets является небезопасным и не поддерживается C Standard больше.

Также неплохо использовать магические числа, например 32. Его значение неясно.

В вашей программе массиве cuv не нулевой инициализируются поэтому следующее заявлению

n = strlen(cuv) - 1; 

результатов неопределенного поведения программы. Также не каждый раз придумывать длину строки.

Смежные вопросы