仅使用scanf从用户接收字符串并打印它。C语言

仅使用scanf从用户接收字符串并打印它。C语言,c,C,请原谅奇怪的格式。这是我的第一篇文章。在分配中,我必须使用scanf(“%c”)从用户处接收字符串,将其存储到数组中(例如,字符串[5]),然后使用scanf(“%s”)打印输入的字符串。我尝试的所有操作都导致字符串无法正确打印或仅打印第一个单词。非常感谢您的帮助 #include <stdio.h> int main(void) { char string[81]; int i = 0; printf("Please enter a string. "); sca

请原谅奇怪的格式。这是我的第一篇文章。在分配中,我必须使用scanf(“%c”)从用户处接收字符串,将其存储到数组中(例如,字符串[5]),然后使用scanf(“%s”)打印输入的字符串。我尝试的所有操作都导致字符串无法正确打印或仅打印第一个单词。非常感谢您的帮助

#include <stdio.h>
int main(void)
{
  char string[81];
  int i = 0;

  printf("Please enter a string. ");
  scanf("%c", string);

 while (string[i+1] != '\0')
 {
   printf("%s", i);
   i++;
 }
 return 0;
}
#包括
内部主(空)
{
字符串[81];
int i=0;
printf(“请输入字符串”);
scanf(“%c”,字符串);
while(字符串[i+1]!='\0')
{
printf(“%s”,i);
i++;
}
返回0;
}

您可以使用char来保存每个输入的字符,但这有点棘手,因为您实际上使用了指向char的指针。您还需要更改最终的printf语句:

#include <stdio.h>
int main(void) {
    char string[81];
    int i = 0;
    char placeholder = '0';
    char* a = &placeholder;           //pointer to char for scanf to load
    printf("Please enter a string: ");
    while (*a != '\n' && i + 1 < 81) {    //deref pointer for comparison (&& size limit)
        scanf("%c", a);
        string[i] = *a;               //copy char into cstring array (deref again)
        i++;
    }
    string[i] = '\0';                 //add the null terminator
    i = 0;                            
    while (string[i+1] != '\0') {
        printf("%c", string[i]);     //this prints char by char
        i++;
    }
    printf("\n");
    return 0;
}
#包括
内部主(空){
字符串[81];
int i=0;
字符占位符='0';
char*a=&placeholder;//指向要加载的scanf的char的指针
printf(“请输入字符串:”);
而(*a!='\n'&&i+1<81){//deref指针用于比较(&&size limit)
scanf(“%c”,a);
string[i]=*a;//将字符复制到cstring数组中(再次删除)
i++;
}
字符串[i]='\0';//添加空终止符
i=0;
while(字符串[i+1]!='\0'){
printf(“%c”,字符串[i]);//此命令逐字符打印
i++;
}
printf(“\n”);
返回0;
}
编辑[参见注释]

使用scanf打印输入的字符串(“%s”)无法获得该结果,但我认为您正在尝试在不同时输入所有字符串的情况下执行此操作。 这可能是您想要的:

#include <stdio.h>
int main(void)
{
  int somelimit = 81;
  char string[somelimit];
  int i = 0;
  int ch;
  printf("Please enter a string.\n");
  while((ch = getchar()) != '\n' && ch != EOF ) {
    if (i < somelimit) {
       string[i++] = ch;
    }
  }
  string[i] = '\0';
  i = 0;

  while(string[i] != 0)
  {
    printf("%c",string[i]);
    ++i;
  }
  printf("\n");

 return 0;
}
#包括
内部主(空)
{
int-somelimit=81;
字符字符串[somelimit];
int i=0;
int-ch;
printf(“请输入字符串。\n”);
而((ch=getchar())!='\n'&&ch!=EOF){
if(i
请注意,您需要为此设置缓冲区限制。

scanf(“%c”,字符串)仅读取1个字符

使用
getchar()
继续读取,直到缓冲区满、行结束、文件结束、输入错误

#include <stdio.h>

int main(void) {
  char string[81];

  printf("Please enter a string. ");

  int ch;
  size_t i = 0;
  while((i < sizeof string - 1) && (ch = getchar()) != '\n' && ch != EOF) {
    string[i++] = (char) ch;
  } 
  string[i] = '\0';  // Append null character to form a _string_

  printf("<%s>\n", i);
  return 0;
}
#包括
内部主(空){
字符串[81];
printf(“请输入字符串”);
int-ch;
尺寸i=0;
而((i
您使用哪个字符串来测试它?使用
%c
读取单个字符,而不是以null结尾的字符串。您正在寻找
%80[^\n]
?@albertosinaglia任何包含多个单词的内容。像“Hello world”或“Doing this”。@JonathanLeffler不,我只允许使用scanf(“%C”)或getchar(),然后需要在
scanf()
周围循环以读取组成字符串的多个字符。理论上,您可以使用
%80c
获得80个字符,但这可能不是您想要的(尤其是因为它不是以null结尾的字符串)。
如果(i
关闭1。尝试
如果(i+1
什么是1关闭的?在这里,我将
somelimit
定义为字母计数。根据你的情况,我将再储存一封我不想要的信@当
i
80
时,chux恢复monicaconsider,然后
如果(i
为真。然后
string[i++]=ch;
i==81
。然后循环结束后,代码尝试
string[81]='\0';
,超过数组末尾一个。
如果(i+1
不“存储一个字母”。它最多可以少存储一个。我会在有空时检查它,并在必要时进行更改@chux monicamy compiler(gcc-9.2-Wall-pedantic)我也抱怨过这一点!我尝试先设置
char*a=NULL
,但遇到了一个seg错误。我想声明一个新的char并指向它是正确的方法?…或者
char a=0;…而(a!='\n'&&I+1<81)…scanf(“%c”,&a);string[I]=a;
.Pointer变量不需要。哦,那更干净了。出于娱乐/教育目的,我将它保持原样。