2017-02-03 15 views
0

Для выполнения задания, которое я выполняю, мне нужно распечатать инициалы из строки в C (или массив символов). Для этого я знаю, что мне нужно найти, где находится ПРОБЕЛ, используя (int) name [i] == 32, чтобы определить, является ли текущий символ пространством. Моя единственная проблема заключается в том, что мне трудно понять, как я могу найти это пространство, а затем сохранить следующий символ в массиве символов. (например, пользователь вводит Майка Бэггинса, я должен распечатать MB). Я отправлю свой код ниже, чтобы показать вам, как далеко я получил. Пожалуйста, помогите, но, пожалуйста, не дайте мне полного решения. Спасибо!Попытка захватить символ после пробела в C

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

int main(void) 
{ 
    string name = get_string(); // gets the user's input 
    char firstI = name[0]; // stores the first character from the user's input 
    int len = strlen(name); 
    if((int)firstI >= 97 && (int)firstI <= 122) // checks if the character is lowercase 
    { 
     firstI -= 32; // makes the value uppercase 
    } 
    for(int i = 0; i < len; i++) 
    { 
     if((int)name[i] == 32) // checks if the character is SPACE 
     { 
      printf("I found a space!\n"); // prints out "I found a space" 
     } 
    } 
    printf("%c\n", firstI); // prints out the first initial 
} 
+3

Почему вы используете 'name [i]'? Используйте 'name [i] == '''! Также 'for (int i = 0, len = strlen (name); i

+4

Есть удобные и портативные функции 'islower' и' toupper' ... И вам действительно не нужен первый. –

+0

Что значит «означает, что вы не знаете, как представлены строки». Легко использовать strlen(), чтобы получить всю длину строки для анализа, поэтому я просто использовал strlen(). – Nik

ответ

1

Это на самом деле просто, увидеть это, например

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

int 
main(void) 
{ 
    char array[10]; 
    char string[] = "Mike Baggins"; 
    int j; 
    // Always put the first non-whitespace 
    // character (we should probably skip all 
    // spaces first 
    array[0] = string[0]; 
    // Now start at the character following the first 
    j = 1; 
    for (int i = 1; ((string[i - 1] != '\0') && (j < sizeof(array) - 1)); ++i) { 
     if (string[i - 1] == ' ') { 
      array[j++] = toupper(string[i]); 
     } 
    } 
    array[j] = '\0'; 
    puts(array); 
    return 0; 
} 

Все, что мне нужно было знать, что строки просто массивы с особым значением, отмечающий конец их и Rightarrow; '\0'. Конечно, вы можете улучшить его много. Например, вы могли бы подсчитать количество инициалов в строке ввода и выделить достаточно места для их хранения.

Кроме того, это будет работать, только если интересный персонаж сразу следует за пространством, но, зная, что это всего лишь массив, я уверен, что вы можете выяснить, как его расширить, чтобы он игнорировал последовательные пробелы.

+0

Интересно ... -1! –

+0

Ах! Я понимаю, что вы имели в виду сейчас! Я знал, что они были представлены так, как в памяти, но я видел всю строку (включая маркер пробела (ПРОБЕЛ) как строку в себе и мысль с использованием «\ 0» была бы бессмысленной). Спасибо! Теперь я буду возиться с моей программой и посмотреть, смогу ли я заставить ее работать. Спасибо! – Nik

+0

@ Ник, хотя это простая концепция, я нахожу, что многие люди, изучающие c, не знают об этом. Кроме того, идея расширяема для других типов объектов, таких как указатели, вы можете иметь последовательность указателей, заканчивающуюся указателем «NULL» и итерации таким же образом, на самом деле это идея связанных списков. –