2015-10-08 5 views
-2

Итак, я хочу создать код, который заглавны первой буквой каждого слова в строковом массиве, а затем выводит строку в обратном порядке. Я не мог напечатать массив в обратном порядке, но с этим в сторону, это то, что я придумал:Заглавные буквы каждого слова в строковом массиве

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

int main() { 
    char string[100]; 
    int i, j; 
    char newString[100]; 

    printf("\nEnter string: "); 
    gets(string); 

    for (i=0; i <strlen(string); i++){     
     if (string[i] == ' ' && isalnum(string[i+1])==1){  //if the character is preceded by a space 

      newString[i] = toupper(string[i+1]);  //copy the uppercase of the character to newString 
     } 
     if (isalpha(string[0]) == 1){ //capitalize the first character in the string if it is a letter 
      newString[0] = toupper(string[0]);   //copy character to newString 
     }else{ 
      newString[i] = string[i];     
     } 

    } 

    printf("%s", newString); //preferably, the newString should be printed in reverse order, but I can't seem to do it. 
} 

Если:

Вход: Каррен Леннарт

Предполагаемый выход этого кода: Каррен Леннарт

(то, что я хочу: narruC tranneL)

Как это, все, что я получаю выход:

curran lennarta 

Ввод «дамских дам» приводит к «дамским котятам». Если вход:

julie olsen 

Выход:

julie olsenw 

Пожалуйста, помогите. :(

+0

'man isalpha' дает' RETURN VALUE: возвращаемые значения отличны от нуля, если символ c попадает в тестируемый класс и равен нулю, если нет. Таким образом, вы не можете быть уверены: 'isalnum (string [i + 1]) == 1' будет' true', даже если это буквенно-цифровой символ. – Missu

ответ

1

Вы можете использовать strtok разделить вашу строку с указанным разделителем (в данном случае пространства), а затем, когда у вас есть ваши слова расщепляются заглавный полукокс.

char input[] = "A bird came down the walk"; 
    printf("Parsing the input string '%s'\n", input); 
    char *token = strtok(input, " "); 
    while(token) { 
     puts(token); 
     token = strtok(NULL, " "); 
    } 

    printf("Contents of the input string now: '"); 
    for(size_t n = 0; n < sizeof input; ++n) 
     input[n] ? printf("%c", input[n]) : printf("\\0"); 
    puts("'"); 

Тогда вы реверс всех букв в строке

void inplace_reverse(char * str) 
{ 
    if (str) 
    { 
    char * end = str + strlen(str) - 1; 

    // swap the values in the two given variables 
    // XXX: fails when a and b refer to same memory location 
# define XOR_SWAP(a,b) do\ 
    {\ 
     a ^= b;\ 
     b ^= a;\ 
     a ^= b;\ 
    } while (0) 

    // walk inwards from both ends of the string, 
    // swapping until we get to the middle 
    while (str < end) 
    { 
     XOR_SWAP(*str, *end); 
     str++; 
     end--; 
    } 
# undef XOR_SWAP 
    } 
} 
1

Try:

int main() { 
    char string[100]; 
    int i, j; 

    printf("\nEnter string: "); 
    gets(string); 

    if (isalpha(string[0])){    //capitalize the first character in the string if it is a letter 
     string[0] = toupper(string[0]); //copy character to newString 

    for (i=1; i <strlen(string); i++){     
     if (string[i-1] == ' ' && isalnum(string[i]))  //if the character is preceded by a space 
      string[i] = toupper(string[i]);  //copy the uppercase of the character to newString 
    } 
    i=strlen(string); 
    while (i){ 
     int j= i; 
     while (j && j!=' ') j--; 
     printf("%.*s ", i-j,string+j); 
     i=j; 
    } 
    return 0; 
} 
1

Я полагаю, вы не слышали, что gets() устарел, поэтому в этом примере я использую fgets(), но будьте осторожны, он сохраняет любые завершающие newline. Мой метод состоит в том, чтобы разбить входные данные на «токены», поэтому обращение к newline одновременно с пробелами.

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

int main(void) { 
    char string[100]; 
    char *tptr; 
    size_t i, len; 

    printf("\nEnter string: "); 
    if (fgets(string, sizeof(string), stdin) == NULL) 
     return 1; 

    tptr = strtok(string, " \n\r\t"); 
    while (tptr != NULL) { 
     tptr[0] = toupper(tptr[0]); 
     len = strlen(tptr); 
     for(i=0; i<len; i++) 
      printf("%c", tptr[len-1-i]); 
     tptr = strtok(NULL, " \n\r\t"); 
     if (tptr != NULL) 
      printf(" "); 
    } 
    printf("\n"); 
    return 0; 
} 

Sample работает с использованием ваших данных

Enter string: curran lennart 
narruC tranneL 

Enter string: kate daniels 
etaK sleinaD 

Enter string: julie olsen 
eiluJ neslO 
1

значение ASCII из 'А' 65 и 'а' 97

так что это alogrithm

->accept the string ,now read the array character by character till null character 
-> if(character>=97 and character<=122) 
     character=character-32 
->now reverse the string using standard library function strrev(string) 
->print it 
1

это самый простой способ сделать это (человеческие логики :))

int main(void){ 
    int i,l,m,upper=1; 
    char c; 
    char buff[]="this is a simple string"; 

    l=strlen(buff); 

    printf("Original string:\n\t'%s'\n\n",buff); 

    /*capitalize*/ 
    for(i=0;i<l;i++){ 
     if(upper) 
      buff[i]=toupper(buff[i]); 
     upper=isspace(buff[i]); 
    } 
    printf("Capitalized:\n\t'%s'\n\n",buff); 

    /*reversing*/ 
    for(i=0;i<(l/2);i++){ 
     c=buff[i]; 
     buff[i]=buff[l-(i+1)]; 
     buff[l-(i+1)]=c; 
    } 
    printf("Reversed:\n\t'%s'\n\n",buff); 
    return 0; 
}