2016-03-02 3 views
0

мне нужна помощь в следующем:Создать массив строк из входной строки

Отдельные каждый последовательный массив прописные, строчные буквы и цифры в отдельные строки из входной строки. Предположим, что входная строка содержит только прописные, строчные буквы и цифры. Строка ввода не имеет пробелов.

Example: 
Input string: thisIS1inputSTRING 
OUTPUT: 
1. string: this 
2. string: IS 
3. string: 1 
4. string: input 
5. string: STRING 

Следующая программа не дает никаких выходных данных:

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

int main() { 
    char str[512], word[256]; 
    int i = 0, j = 0; 

    printf("Enter your input string:"); 
    gets(str); 

    while (str[i] != '\0') { 

     //how to separate strings (words) when changed from 
     //uppercase, lowercase or digit? 
     if (isdigit(str[i]) || isupper(str[i]) || islower(str[i])) { 
      word[j] = '\0'; 
      printf("%s\n", word); 
      j = 0; 
     } else { 
      word[j++] = str[i]; 
     } 
     i++; 
    } 

    word[j] = '\0'; 
    printf("%s\n", word); 

    return 0; 
} 
+2

'если (isdigit (str [i]) || isupper (str [i]) || islower (str [i])) 'всегда будет истинным. Таким образом, вы устанавливаете первый символ слова '' '' 0 'много раз и печатаете его много раз. –

+0

@Cool Guy Setting (str [i] == '') в выражении if будет отделять слова от входной строки, если входная строка имела пробелы. Можно ли только изменить оператор if в приведенной выше программе, чтобы разделение продолжалось после каждого изменения в верхнем, нижнем регистре или цифре? – user300048

+1

Необходимо изучить характер изменений типа. – BLUEPIXY

ответ

2

Ваше решение пошло не так, как и написано в комментариях заявление (isdigit(str[i]) || isupper(str[i]) || islower(str[i])) всегда верно.

Если вы хотите придерживаться своего решения с помощью инструкции if, вам необходимо проверить следующий следующий символ. Если следующий тип персонажа отличается от фактического типа символа, вам нужно распечатать свое слово, потому что следующий символ отличается от другого.

Я настроил свой код на следующее:

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

int main() { 
    char str[512], word[256]; 
    int i = 0, j = 0; 

    printf("Enter your input string:"); 
    gets(str); 

    while (str[i] != '\0') { 
      //how to separate strings (words) when changed from 

      // Is the next character the end of the string? 
      if(str[i+1] != '\0'){ // <<< 
       //uppercase, lowercase or digit? 
       if (
        isdigit(str[i]) && (isupper(str[i+1]) || islower(str[i+1])) // <<< 
        || isupper(str[i]) && (isdigit(str[i+1]) || islower(str[i+1])) // <<< 
        || islower(str[i]) && (isupper(str[i+1]) || isdigit(str[i+1])) // <<< 
       ){ 
         word[j] = str[i]; // <<< 
         word[j+1] = '\0'; // <<< 
         printf("%s\n", word); 
         j = 0; 
       } else { 
         word[j++] = str[i]; 
       } 
      } 
      else { 
       // End of the string, write last character in word 
       word[j] = str[i]; // <<< 
       word[j+1] = '\0'; // <<< 
       printf("%s\n", word); 
      } 
      i++; 
    } 
    return 0; 
} 

Это приведет к следующему выходу:

Enter your input string:this 
IS 
1 
input 
STRING 

Вы можете проверить это на собственном link[^]

+1

. Это не работает правильно, последний символ отсутствует на выходе. – Groo

+0

О, я вижу, спасибо за ваш совет, мне пришлось добавить строку в конце. Я знаю, что это плохо написано, но работает. – Frodo