C - 不打印整个字符串

时间:2013-08-07 00:29:46

标签: c string printf scanf

int main()
{
    //Define Variables

    char studentName;

    //Print instructions to fill the data in the screen
    printf("Please type in the Students name:\n");
    scanf("%s", &studentName);
    printf("\n\n%s", &studentName);

    return 0;
}

看到上面的代码,当我输入一个句子时,我只是打印出第一个单词。

我知道这是一个基本的事情,但我只是从简单的C开始。

6 个答案:

答案 0 :(得分:4)

阅读scanf(3)文档。对于%s来说是

   s      Matches a sequence of non-white-space characters; the next
          pointer must be a pointer to character array that is long
          enough to hold the input sequence and the terminating null
          byte ('\0'), which is added automatically.  The input string
          stops at white space or at the maximum field width, whichever
          occurs first.

所以你的代码错了,因为它应该有studentName的数组,即

char studentName[32];
scanf("%s", studentName);

由于可能buffer overflow而仍然很危险(例如,如果您键入32个或更多字母的名称)。使用%32s代替%s可能会更安全。

还要养成使用所有警告和调试信息进行编译的习惯(即如果GCC使用gcc -Wall -g)。有些编译器可能会警告过你。学习使用调试器(例如gdb)。

此外,请习惯结束 - 不使用printf开始您的\n格式字符串(或者调用fflush,请参阅fflush(3))。

了解undefined behavior。你的程序有一些!它错过了#include <stdio.h>指令(作为第一个非注释重要行)。

BTW,阅读C中现有的免费软件代码也会教你很多东西。

答案 1 :(得分:4)

您的代码有三个问题:

  • 您正在将字符串写入分配给单个字符的内存块中;这是未定义的行为
  • 您正在从为单个字符分配的内存块中打印字符串 - 也是未定义的行为
  • 您正在使用scanf来读取带空格的字符串; %s停在第一个空格或行尾字符处。

解决此问题的一种方法是使用fgets,如下所示:

char studentName[100];

//Print instructions to fill the data in the screen
printf("Please type in the Students name:\n");
fgets(studentName, 100, stdin);
printf("\n\n%s", &studentName);

return 0;

答案 2 :(得分:1)

尝试 scanf(“%[^ \ n]”,&amp; studentName); 而不是 scanf(“%s”,&amp; studentName);

答案 3 :(得分:1)

这种情况正在发生,因为%s会在遇到空格时立即停止读取输入。

为了避免这种情况,你可以做的是声明一个字符串所需长度的数组。

然后使用此命令输入字符串: -

scanf("%[^\n]s",arr);

这样scanf将继续读取字符,除非遇到'\ n',换句话说你按下键盘上的回车键。这会给出一个新的线路信号并且输入停止。

int main()
{
    //Define Variables

    char studentName[50];

    //Print instructions to fill the data in the screen
    printf("Please type in the Students name:\n");
    scanf("%[^\n]s", &studentName);
    printf("\n\n%s", &studentName);

    return 0;
}

或者您也可以使用gets()和puts()方法。如果您正在为非常基本的问题编写代码,这将真正简化您的工作。

[编辑]:正如dasblinkenlight所指出的......我也不建议你使用gets函数,因为它已被弃用。

int main()
    {
        //Define Variables

        char studentName[50];

        //Print instructions to fill the data in the screen
        printf("Please type in the Students name:\n");
        gets(studentName); printf("\n\n");
        puts(studentName);

        return 0;
    }

答案 4 :(得分:0)

你的问题在这里

char studentName;

它是 char ,而不是字符串。

尝试:

  1. 将其定义为char studenName[SIZE];等字符数组。
  2. 使用malloc动态分配内存:
  3. char buffer[MAX_SIZE];
    scanf("%s", &buffer);
    char * studentName = malloc (sizeof(buffer) + 1);
    strcpy (studentName , buffer);
    

答案 5 :(得分:0)

进行以下更改并尝试使用。我在studentName定义之后添加了[80],告诉编译器studentName是一个包含80个字符的数组(否则编译器会把它当作一个char)。此外,&amp; studentName之前的符号不是必需的,因为数组的名称隐含了一个指针。

int main()
{
  //Define Variables

  char studentName[80];

  //Print instructions to fill the data in the screen
  printf("Please type in the Students name:\n");
  scanf("%s", studentName);
  printf("\n\n%s", studentName);

  return 0;

}