2013-05-01 53 views
-1

我想要做的是採取一個大輸入(直到用戶按下輸入(\ n)),然後調用一個函數,把這個輸入的第一個字(讀直到'')。我的問題是,即使它看起來很簡單,它也有2個額外的外星人字符。這是我的代碼:如何殺死我的字符串中的外星人字符?

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

void findChoise(char *input, char *choise); 

int main() 
{ 
    char choise[12]; 
    char input[300]; 
    printf("give me the input: "); 
    gets(input); 
    printf("%s\n", input); 
    printf("%s%d\n", "length of input: ", strlen(input));//for checking 
    findChoise(input, choise); 
    printf("%s%d\n", "length of output: ", strlen(choise));//for checking 
    printf("%s\n", choise); 
    return 0; 
} 

void findChoise(char *input, char *choise) 
{ 
     int i=0; 
     while(input[i] != ' ') 
     { 
      choise[i] = input[i]; 
      i++; 
     }; 
} 
+2

爲了簡潔起見,您**爲了安全和'strchr()'需要**使用'fgets()'。 (在適當的情況下,爲了const正確性,可以使用const char *和const char *)。 – 2013-05-01 00:14:09

回答

1

您還需要編寫一個空字符結束的choise字符串:

void findChoise(char *input, char *choise) 
{ 
     int i=0; 
     while(input[i] != ' ') 
     { 
      choise[i] = input[i]; 
      i++; 
     } 
     choise[i] = 0; 
} 

也不要使用gets

fgets(input, sizeof(input), stdin); 

,並使用%zu打印size_t

printf("%s%zu\n", "length of input: ", strlen(input)); 
+0

也被稱爲「選擇」。 – 2013-05-01 06:35:02

+0

也是我猜的選擇... – perreal 2013-05-01 06:35:48

2

你已經做的非常接近。你只是缺少字符串末尾的空字符(「\ 0」)。我已經清理了一些代碼並修復了一些問題。請仔細閱讀並嘗試理解正在發生的事情。

主要要注意的事情:

  1. 所有字符串的字符數組,並與空字符終止「\ 0」
  2. 當你聲明的緩衝區(輸入和選擇),儘量讓他們2的冪這與到由於他們是如何存儲在內存中
  3. 避免使用gets並嘗試scanf代替

    #include <cstdio> 
    
    void findChoice(char*, char*); 
    
    int main() { 
        char choice[16]; 
        char input[512]; 
    
        scanf("%s", input); 
        findChoice(choice, input); 
        printf("%s", choice); 
    
        return 0; 
    } 
    
    void findChoice(char* input, char* choice) { 
        int i = 0; 
    
        while(input[i] != ' ') { 
         choice[i] = input[i]; 
         ++i; 
        } 
        choice[i] = '\0'; 
    } 
    
相關問題