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

Using putchar() and getchar() to print individual characters

我正在尝试使用 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++;
    }    
}
  1. getchar() return作为无符号整数的单个字符。您必须将其转换为 char 以避免警告。
  2. getchar return 一个 int,它不分配任何东西。
  3. 按照指示读取一个字符,因此您不能在其上循环。

我认为您应该在循环中搜索 fgets 或 scanf 或调用 getchar(),但您需要使用特定的字符退出循环。

我不太确定你为什么要这样做,但如果我必须这样做,我可能会这样做 -

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

这样就完成了你想要的任务。我尽量让它对初学者友好,对任何疑问发表评论。 乐意效劳。 :)

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

char *string = malloc(50);

等同于

char string[50];

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

int counter=0;

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

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