2016-10-29 6 views
2

Так что мне нужно сделать строку в верхнем регистре + удалить из нее пробелы. Однако он не работает, если строка содержит числа, окончательная печать печатает некоторые символы не-ascii. Как мне заставить его работать? Я попытался сделать это с функциями isalpha() и isdigit(), но результат тот же.c - Как сделать целую строку в верхнем регистре, если она содержит числа?

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

int main(){ 
    int i = 0; 
    char c[100]; 
    char str[] = "Hello8 world"; 

    while(str[i]){ 
     if (str[i]!=' '){ 
      if (str[i] >= '0' && str[i] <= '9'){ 
       c[i]=str[i]; 
      } 
      else{ 
       c[i]=(toupper(str[i])); 
      } 
     i++; 
     } 
    } 
    printf("%s", c); 

    return(0); 
} 
+2

«Он, однако, не работает, если строка содержит цифры, окончательная печать печатает некоторые символы не-ascii». - Это не то, что делает ваш код. Ваш код для строки, заданной в вашем вопросе, вводит бесконечный цикл. Пожалуйста, выберите * который * код, в котором вам нужна помощь. Это этот код? Затем сделайте текст вопроса совпадающим с поведением кода. Это какой-то другой код? Затем отправьте другой код. – hvd

+2

Вы делаете * не * необходимо делать номера в специальном случае. ['toupper'] (http://en.cppreference.com/w/c/string/byte/toupper) только изменяет алфавитные символы и оставляет все остальные неизменными. – usr2564301

+0

@hdv Вы правы, я как бы ожидал часть, которая, как предполагается, не позволяет пробелу перейти в новую строку для работы. Бесконечный цикл вызван if (str [i]! = '') {, Что бы вы предложили? –

ответ

2

Здесь несколько вещей. Во-первых, вы только продвигаете i внутри оператора if, поэтому, как только вы столкнетесь с пространством, ваша проблема застрянет в цикле endlees. Во-вторых, вы предполагаете, что индекс в исходной и целевой строке один и тот же - это неверно, поскольку вы пропускаете пробелы. Это приведет к тому, что целевая строка сохранит единичную память - которая может быть \0 на некоторых платформах и может быть случайным нежелательным для других. Вместо этого, вы должны поддерживать два счетчика индекса, один для источника и один для мишени, и явно установить \0 в конце цели, когда вы сделали:

int i = 0; 
int j = 0; /* Target string index */ 
char c[100]; 
char str[] = "Hello8 world"; 

while(str[i]){ 
    if (str[i]!=' '){ 
     if (str[i] >= '0' && str[i] <= '9'){ 
      c[i]=str[i]; 
     } 
     else{ 
      c[j]=(toupper(str[i])); 
     } 
     j++; /* Target index advance only when it's used */ 
    } 
    i++; /* Source index advanced regardless */ 
} 
c[j] = '\0'; /* Handle the string termination */ 
printf("%s\n", c); 
0

После того, как петли while, добавьте c[i] = '\0';.

Это преобразует массив символов в строку (которая по определению должна иметь \0 в качестве терминатора).

0

Почему бы не использовать цикл, как это:

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

#define MAXCHAR 100 

int 
main(void) { 
    char str[] = "Hello8 world"; 
    char upper[MAXCHAR]; 
    int str_pos = 0, i; 

    for (i = 0; str[i]; i++) { 
     if (!isspace(str[i])) { 
      upper[str_pos++] = toupper(str[i]); 
     } 
    } 
    upper[str_pos] = '\0'; 

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

    return 0; 
} 
+0

Вы можете попробовать этот более простой подход @Aneta Kožoušková – RoadRunner

1

1-Вам не нужно создавать другую строку. 2-Функция toupper() не превращает цифры в нечто другое. 3-Если вы найдете место, вам просто нужно вытянуть остальную часть строки.

int i = 0, j; 
char str[] = "Hello8 world"; 

while(str[i]!='\0') 
{ 
    if(str[i]==' ') 
    { 
     for(j=i;str[j]!='\0';j++) 
     { 
      str[j]=str[j+1]; 
     } 
    } 
    else 
    { 
     str[i]=toupper(str[i]); 
     i++; 
    } 

} 

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

return 0;