如何在有空间时退出scanf循环

问题描述:

例如,用户应该输入类似于“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到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