C从std错误中读取字符串

时间:2011-05-15 13:19:45

标签: c scanf cstring

我想从标准输入读取字符串并在控制台上输出。我用这种方式:

char* cmdline;

do{
    scanf("%s\n", &cmdline);
    printf("%s\n", cmdline);
}while(cmdline != "quit");

但这不起作用。我有这个错误Segmentation fault (core dumped)

4 个答案:

答案 0 :(得分:4)

char* cmdline

是一个指针。您没有分配用于存储字符串的空间。 你应该这样做:

cmdline = malloc(size_of_string);

用于分配动态内存以存储字符串。 否则使用char数组而不是指针:

char cmdline[size_of_string];

答案 1 :(得分:3)

您已定义char *cmdline但未分配cmdline指针

DO

cmdline = malloc (sizeof (char) * n);

第一

根据需要调整字符串长度n

EDIT1: 在你的版本中,当你使用cmdline而没有分配它时,实际上cmdline包含一个可以是任何东西的值,并且使用它来进行内存访问是试图访问一些你不知道在哪里的内存区域并且不允许具有内存保护的操作系统(现在所有操作系统)。因此,当您在 cmdline中存储时,它将进入无效位置,这是不允许的,并且操作系统将针对非法内存访问发出分段错误。

使用malloc调用从OS(堆)分配内存后,cmdline将包含一个值,该值将具有操作系统为您的代码发出的内存位置地址保留给您,您有权写。因此,使用变量引用位置会产生适当的内存引用,您可以正常使用它。另请注意,如果您尝试超出分配的内存块,即超出n位置的访问(如果已分配n个字节),那么您还可以获得段错误,因为内存位置超出该限额未为您注册/分配。虽然在这种情况下您可能不会遇到段错误,但在这样的位置写入可能是不正常的。

尝试详细说明这个问题的唯一原因是,定义char *并且没有分配它在代码中使用它是一个非常常见的弊端,因为旧的Turbo C ++ 3.1没有抱怨,这是使用的有很多人在那里。然后他们打电话给我,告诉我GCC编译器坏了,因为代码没有运行,并且在TC ++ 3.1中运行完美。

EDIT2: 或者只是使用静态数组

char cmdline[MAX_SIZE];

根据您的需要设置MAX_SIZE

EDIT3:OMG

你已经完成cmdline != "quit"这将永远不会奏效。解决方案是

while (strcmp (cmdline, "quit") != 0);
你的代码中的

。这将使cmdline字符串逐个字符与静态字符串“quit”匹配

您的解决方案永远不会有效,因为当您执行cmdline != "quit"时,只会比较两个地址。首先,cmdline表示您使用malloc调用分配的地址,第二个是字符串“quit”的地址,它位于可执行文件的数据部分内,或者只是在内存中的某个区域内你的程序加载的地方,你不知道。比较这两个值不会比较这些地址的内容,即不会比较它内部的字符串。

EDIT4: 另外scanf ("%s", &cmdline);不正确,因为cmdline本身代表您要存储字符串的位置的地址。正确的代码是:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (void)
{
  char *cmdline;
  cmdline = malloc (sizeof (char) * 128);       /* or whatever size */
  do
    {
      scanf ("%s", cmdline);
      printf ("%s\n", cmdline);
    }
  while (strcmp (cmdline, "quit") != 0);
  return 0;
}

答案 2 :(得分:3)

cmdline只是一个指针 - 你需要使用malloc或固定大小的数组为它实际分配空间。

答案 3 :(得分:3)

char cmdline[80];

do {
    scanf("%79s\n", cmdline);
    printf("%s\n", cmdline);
} while(strcmp(cmdline, "quit"));

我发现你的代码有三个错误:

  1. 不为输入缓冲区分配内存
  2. 未将缓冲区传递给scanf
  3. 不使用strcmp来比较字符串