如何在有空间时退出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个字符时我会得到额外的字符。 谢谢!
答
由于该指数是从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;
}
你的缓冲区不够大,而你需要做的'== 1'而不是'!= EOF' – 2014-11-05 00:38:42
@MattMcNabb谢谢马特!我会更新它。 – Frank 2014-11-05 00:43:13
in'if(input_string [i] =='\ 0')''\ 0''表示字符串结束,如果你发现它应该打破循环。 – SHR 2014-11-05 00:46:06