0

我无法将值插入 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);
           }

}

原因我知道:

我将 do-loop exit 放在 '\n' 上,并且在总共插入值后我正在使用 enter('\n') 本身。这样它就退出循环而不插入值。

我该如何纠正?

4

3 回答 3

2

因为scanf确实在输入流中进行了扫描\n,但没有将其存储在&total. 下次你getchar()会得到它\n,这会导致 do-while 只能执行一次。
添加

getchar();

扫描后。

输入流:

            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        
于 2012-12-26T09:20:43.740 回答
2

你正在做的事情有点不安全。首先取决于操作系统,您可能必须在 '\r' 上终止,而不仅仅是在 '\n' 上。其次,您永远不会检查输入的大小是否在 15 个符号以内。请注意,我说的是15 个符号,因为通常最好的做法是为零终止字符留一个单元格。

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

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

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

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

如果你调试你的程序,你会看到这种情况发生。

于 2012-12-26T09:30:32.010 回答
0

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

您没有超出数组索引限制进行任何检查。可能是用户不断输入字符,而您最终尝试插入超过 16 个位置。

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

会解决你的问题。

于 2012-12-26T09:26:48.233 回答