2
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 开始。

4

6 回答 6

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);

由于可能的缓冲区溢出,这仍然很危险(例如,如果您键入 32 个或更多字母的名称)。使用%32s而不是%s可能更安全。

还要养成在启用所有警告和调试信息的情况下进行编译的习惯(即,如果使用带有GCCgcc -Wall -g的 GCC )。一些编译器可能已经警告过你。学习使用您的调试器(例如gdb)。

此外,养成使用(或调用,参见fflush(3) )结束 - 不开始 -printf格式字符串的习惯。\nfflush

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

顺便说一句,用 C 语言阅读现有的自由软件代码也会教给你很多东西。

于 2013-08-07T00:31:49.403 回答
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;
于 2013-08-07T00:33:11.623 回答
1

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

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

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

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

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

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;
    }
于 2013-08-07T09:53:35.693 回答
1

试试scanf("%[^\n]", &studentName); 而不是scanf("%s", &studentName);

于 2013-08-07T03:28:13.787 回答
0

你的问题在这里

char studentName;

它是一个char,而不是一个字符串。

尝试:

  1. 将其定义为一个字符数组,例如char studenName[SIZE];.
  2. 使用动态分配内存malloc

.

char buffer[MAX_SIZE];
scanf("%s", &buffer);
char * studentName = malloc (sizeof(buffer) + 1);
strcpy (studentName , buffer);
于 2013-08-07T00:32:48.360 回答
0

进行以下更改并尝试一下。我在 studentName 定义之后添加了 [80],告诉编译器 studentName 是一个 80 个字符的数组(否则编译器会将其视为一个字符)。此外,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;

}

于 2013-08-07T00:33:57.863 回答