通过getchar插入值

时间:2012-12-26 09:09:32

标签: c

我无法在ptr char数组中插入值:

int main() {

  char S[MAX_STRING_LENGTH],*str;

  int total,j=0,i=0;
  char ptr[16],c;

    scanf("%d",&total);

      for(i=0;i<total;i++){
          c=getchar();
           do{

           ptr[j]=(char)tolower(c);
           j++;
           c=getchar();
           }while(c!='\n' && j<15 );

           ptr[j]='\0';
           printf("j=%d , %s",j,ptr);
           }

}

我知道的原因是:

我在'\ n'上放了do-loop exit,并且在插入总值后我使用了enter('\ n')本身。 这样就可以在没有插入值的情况下退出循环。

我该如何纠正?

3 个答案:

答案 0 :(得分:2)

由于scanf确实扫描了输入流中的\n,但未将其存储在&total中。下次getchar()它将获取\n导致执行操作只能执行一次。
添加

getchar();

在scanf之后。

输入流:

            the next you getchar() will from here
             |
             | 
A A A A A A \n A A A A A A
          ^
          |
  the variable total store string before this        

答案 1 :(得分:2)

你在做什么是不安全的。首先,根据操作系统的不同,您可能不得不在'\ n'上终止'\ n'。其次,您永远不会将输入的大小检查为15个符号。请注意我说 15个符号,因为通常最好将一个单元格留给零终止字符。

如果输入不包含空格(空格或制表符),我建议您使用scanf("%s"),因为它不易出错。此外,您将无需使用while循环。

如果不是这种情况,您还应该添加对'\ r'的检查,并且还必须删除在总值之后键入的换行符。像这样:

scanf("%d", &total);
getchar();

这是必要的,因为否则总计后的换行符将是你在while循环中读取的第一个char,因此你将在循环的第一次迭代时退出。

如果您调试程序,您会发现这种情况发生。

答案 2 :(得分:0)

在scanf期间,您将输入一些no(​​字符数)表示10并且将按Enter键。现在这个'\ n \'将不会被scanf读取,它就在输入流中。在第一次迭代期间,getchar()将读取此'\ n'并在第一次迭代后终止循环。所以最好在scanf()之后放一个getchar(),这样就不会让输入流变空。除此之外,

您没有对数组索引限制进行任何检查。也许是用户继续输入字符的情况,你最终试图插入超过16个位置。

 while(c != '\n' && j < 15);

将解决您的问题。