2016-10-29 38 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

這裏有幾個錯誤。首先,您只在if聲明中預先輸入i,因此一旦遇到空格,您的問題就會陷入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

爲什麼不使用一個for循環,像這個:

#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

你可以試試這個更簡單的方法@AnetaKož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; 
相關問題