使用putchar()和getchar()打印单个字符

时间:2017-10-20 21:20:50

标签: c getchar putchar

我尝试使用putchar()和getchar()来读取用户的一串字符,然后我的循环将打印每个字符三次,打印一个新行等等,直到每一个变量中的字符" userInput"已被打印。当我尝试编译我的程序时,我收到以下错误:

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++;
    }    
}

3 个答案:

答案 0 :(得分: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指针会产生错误。另外我宣布了一个变量&#34; c&#34;您稍后会看到。
  • 我使用标准i代替计数器,并声明了一个可变长度来存储字符串长度。
  • 第08行有趣的事情,而(c = getchar())。它的作用是,只要输入流中存在一个字符(由用户输入),它就会一直读取一个字符并将其存储在变量c中。
  • 在第09行,我检查c是否包含换行符(即用户按下了Enter / Return键)。如果是这种情况,我会停止读取字符串并使用第10行中的break关键字退出循环。
  • 在第11行中,我将字符c存储在userInput数组的第i个索引处,并同时递增i。你可以在两行中做同样的事情。
  • 在第13行中,i的值将是输入字符串的长度。在最后一个索引处,我存储了一个特殊字符&#39; \ 0&#39;这是空终止符。您可以查阅以了解更多信息。
  • 在第14行中,我将i的值存储在长度变量中。
  • 从第16-21行开始,我运行一个简单的for循环,从i = 0到length,在每次迭代中,我按照你想要的方式打印3次字符。在第20行,而不是printf(),我使用putchar()来打印一个新行,因为&#39; \ n&#39;是个角色,只是为了向你展示。

所以这就是你想做的任务。我试图让它尽可能地初学者友好,对任何疑问发表评论。 乐意效劳。 :)

答案 1 :(得分:0)

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

char string[50];

相当于

int counter=0;

如果只存储单个值,则整数不需要是指针。所以它应该只是

{{1}}

在你写的程序中, getchar()只需要一个字符

你应该使用像gets(string)这样的字符串处理函数; 去做这个 它会让事情变得更容易

答案 2 :(得分:-1)

  1. getchar()返回一个SINGLE字符作为unsigned int。您必须将其强制转换为char以避免警告。
  2. getchar返回一个int,它不会分配任何东西。
  3. 据说它读了一个字符,所以你不能循环它。
  4. 我认为您应该在循环中搜索fgets或scanf或调用getchar(),但是您需要使用特定的char来退出循环。