2014-11-05 22 views
-2

例如,用戶應該輸入類似於「ABC123」的輸入,而不是「ABC 123」或「BC123」。如何在有空間時退出scanf循環

這裏是我的代碼:

unsigned int convert_to_num(char * string) { 
unsigned result = 0; 
char ch; 
//printf("check this one %s\n", string); 
while(ch =*string++) result = result * 26 + ch - 'A' + 1; 
return result; 
} 


int main() 
{ 
char input_string[100]; 
char arr_col[100] = {'\0'}; 
char arr_row[100] = {'\0'}; 
int raiseflag; 
int started_w_alpha =0; 
int digitflag = 0; 
while(scanf("%s", &input_string) != EOF) { 

int i = 0, j = 0, digarr = 0; 

while (i <=5) { 
if (input_string[i] == '\0') {printf("space found!");} 
if ((input_string[i] >= 'A' && input_string[i] <= 'Z') && (digitflag == 0)) { 
started_w_alpha = 1; 
arr_col[j] = input_string[i]; j++; 
} 
//printf("something wrong here %s and %d and j %d\n", arr_holder, i, j); 
if (started_w_alpha == 1) { 

    if (input_string[i] >=48 && input_string[i]<=57){ digitflag = 1; arr_row[digarr] =input_string[i]; digarr++; } 
} 

i++; if (i == 5) { raiseflag =1; } 

} 

printf(" => [%d,%s]\n", convert_to_num(arr_col), arr_row); 
if (raiseflag == 1) { raiseflag = 0; memset(arr_col, 0, 5); memset(input_string, 0, 5); memset(arr_row, 0, 5); digitflag = 0; started_w_alpha = 0; } 

} 
    return 0; 

} 

顯然,\ 0並不在我的情況下工作,因爲我有5和用戶的陣列可以把2個字符。只要在字符之間找到空格,我就想退出循環。

這是整個代碼。我添加了{'\ 0'}我的數組,因爲當少於5個字符時我會得到額外的字符。 謝謝!

+1

你的緩衝區不夠大,而你需要做的'== 1'而不是'!= EOF' – 2014-11-05 00:38:42

+0

@MattMcNabb謝謝馬特!我會更新它。 – Frank 2014-11-05 00:43:13

+0

in'if(input_string [i] =='\ 0')''\ 0''表示字符串結束,如果你發現它應該打破循環。 – SHR 2014-11-05 00:46:06

回答

0

由於該指數是從0到input_string[5];數組大小開始爲5,唯一有效的索引是從0至4

但你的循環while (i <=5) {去,直到5,它意味着你超過數組。

如果向字符串中插入5個字符,則終止空值爲第6個字符。

由於您超出了其他變量寫入的數組。但你仍然可以找到它,當你檢查input_string[5]

所以,如果你想插入5個字符,你數組的大小應該是至少6

char input_string[6];

,如果你想查詢只有前5個元素你「將不得不環路更改爲:

while (i < 5) {

正如我在評論中寫道,如果你找到終止空,沒有用的,繼續循環,因爲它包含3個n垃圾或從先前迭代中剩餘的垃圾。

爲此,你應該打破,如果它發現,像這樣:

if (input_string[i] == '\0') {printf("space found!"); break;}

編輯 檢查這個程序:它使用fgets讀取整個輸入,然後搜索空格。

請注意,它並不會修剪輸入,這意味着當它出現在輸入的開頭或結尾時,它不會刪除空格。

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

int main() 
{ 
    int i ,size; 
    char input_string[100]; 
    fgets(input_string,100,stdin); 
    i=0; 
    size = strlen(input_string); 
    while (i<size-1){ //enter is also count 
     if (isspace(input_string[i])) 
     { 
      printf("space found!"); 
      break; 
     } 
     i++; 
    } 

    return 0; 
} 

EDIT2

與裝飾

現在,所以它會刪除前導和結束空格:

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

char* trim(char *input_string) 
{ 
    int i=0; 
    char *retVal = input_string; 
    i = strlen(input_string)-1; 
    while(i>=0 && isspace(input_string[i])){ 
     input_string[i] = 0; 
     i--; 
    } 

    i=0; 
    while(*retVal && isspace(retVal[0])){ 
    retVal ++; 
    } 
    return retVal; 
} 

int main() 
{ 
    int i ,size; 
    char input_string[100],*ptr; 
    fgets(input_string,100,stdin); 
    ptr = trim(input_string); 
    i=0; 
    size = strlen(ptr); 

    while (i<size){ 
     if (isspace(ptr[i])) 
     { 
      printf("space found!"); 
      break; 
     } 
     i++; 
    } 

    return 0; 
} 
+0

謝謝!我解決了這個問題,但仍然不是我要找的。 – Frank 2014-11-05 01:15:35

+0

只需將數組大小更改爲6,並只檢查5,或直到終止空值。但仍然總是在字符串末尾處終止空,所以您的算法出現問題。 – SHR 2014-11-05 01:20:06

+0

這就是我所做的,但即使沒有空白,它也會一直退出循環。例如,如果我輸入了「AB12」,它就會退出。並且只要在input_string =「AB12」中沒有像「AB 12或A B12」 – Frank 2014-11-05 01:21:26