2017-10-20 44 views
-2

我想用putchar()和getchar()从用户中读取一串字符,然后我的循环将打印每个字符三次,打印新行等等,直到变量“userInput”中的每个字符都已经打印完毕。当我尝试编译我的节目,我收到以下错误:使用putchar()和getchar()打印单个字符

warning: assignment makes pointer from integer without a cast [enabled by default] 
userInput = getchar(); 
     ^
warning: comparison between pointer and integer [enabled by default] 
while(counter < strlen(userInput)) 
      ^
error: array subscript is not an integer 
    putchar(userInput[counter]); 
        ^
error: array subscript is not an integer 
    putchar(userInput[counter]); 
        ^
error: array subscript is not an integer 
    putchar(userInput[counter]); 
        ^

如何解决这些错误?我是C新手,无法弄清楚指针转换错误的意义,以及为什么我的计数器变量不起作用。

我的代码如下:

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

int main(void) 
{ 
    char *userInput; 
    int *counter = 0; 

    printf("Enter a string of characters: "); 
    userInput = getchar(); 


    while(counter < strlen(userInput)) 
    { 
     putchar(userInput[counter]); 
     putchar(userInput[counter]); 
     putchar(userInput[counter]); 
     printf("\n"); 
     counter++; 
    }  
} 
+0

'getchar'读取*一个*字符,而不是一串字符。 – gurka

回答

1

我真的不知道你为什么要做到这一点,但如果我不得不这样做,我可能会做这样的 -

01 #include <stdio.h> 
02 int main() 
03 { 
04  char userInput[100],c; 
05  int length, i=0; 
06 
07  printf("Enter a string of characters: "); 
08  while(c=getchar()){ 
09   if(c=='\n') 
10    break; 
11   userInput[i++] = c; 
12  } 
13  userInput[i]='\0'; 
14  length = i; 
15 
16  for(i=0; i<length; i++){ 
17   putchar(userInput[i]); 
18   putchar(userInput[i]); 
19   putchar(userInput[i]); 
20   putchar('\n'); 
21  } 
22  return 0; 
23 } 

我已经添加行号为了更好的理解。 这里是我做了什么 -

  • 我不需要任何其他的头文件除外stdio.h中,所以删除临时演员。
  • 您可能需要一个字符串(字符数组),所以您必须像第04行那样将其定义为字符数组。由于getchar()返回一个字符,因此将它分配给一个char指针会给出错误。另外我声明了一个变量“c”,你会在后面看到。
  • 而不是计数器,我使用标准我,并宣布一个可变长度来存储字符串的长度。
  • 第08行中有趣的事情,while(c = getchar())。只要输入流中存在一个字符(由用户输入),它就会持续读取字符并将其存储在变量c中。
  • 在第09行中,我检查c是否包含换行符(即用户按下Enter/Return键)。如果是这样的话,我停止阅读字符串,并使用第10行中的break关键字跳出循环。
  • 在第11行中,我将字符c存储在userInput数组的第i个索引处,并将i同时。你可以在两行中做同样的事情。
  • 在第13行中,i的值将是输入字符串的长度。在最后一个索引处,我存储了一个特殊字符'\ 0',它是空终止符。你可以查看它了解更多。
  • 在第14行中,我将长度变量i的值存储起来。
  • 从第16-21行开始,我运行一个简单的for循环,从i = 0到length,并且在每次迭代中,我都会按照您的意愿打印该字符3次。在第20行中,而不是printf(),我使用putchar()来打印一个新行,因为'\ n'是一个字符,只是为了向您显示。

所以这就完成了你想要的任务。我试图尽可能使初学者友好,并对任何疑问发表评论。 很高兴提供帮助。 :)

-1
  1. 的getchar()返回一个单个字符为unsigned int。你必须将其转换为char来避免警告。
  2. getchar返回一个int,它不分配任何东西。
  3. 据说它读了一个字符,所以你不能循环。

我认为你应该搜索fgets或scanf或者在循环中调用getchar(),但是你需要使用特定的char来退出循环。

0

如果你想使用字符指针来存储数据,你需要有一个现有的字符串,你可以使这个字符指针指向,或者你需要动态分配的字节数,然后可以用于存储新数据。

char *string = malloc(50); 

相当于

char string[50]; 

也整数并不需要是一个指针,如果你只存储一个值。因此,它应该只是

int counter=0; 

在节目中你写信了, 的getchar()只需要一个单一的字符

您应该使用字符串处理函数一样获取(串); 要做到这一点 它会让事情变得更容易

相关问题