0

我正在测试这个应该读取用户输入的函数,但它给我带来了分段错误

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

#define MAX_STRING_LENGTH 10

int 
readinput(char *input)
{
    int c;
    int i=0;
    while((c=getchar()) != EOF && c != '\n')  //Here is where the warning occurs.
    {
        input[i]=c;
        i++;
    }
    input[i]=0;
    if(strlen(input)>0)
    {
        if(isalpha(input[0]) && input[1]=='-' && isalpha(input[2]) && strlen(input)==3)
            return 0;
        else if(!strcmp(input, "quit"))
            return 1;
        else if(!strncmp(input, "save ", 5))
            return 2;
        else if(!strcmp(input, "undo"))
            return 3;
    }
    return -1;
}

int main()
{
   char *str;
   printf("write a string\n");
   int nr=readinput(str);
   printf("%d\n", nr);
   printf("%s\n", str);
   return 0;
}

我确实注意到了我犯的愚蠢错误,但仍然存在分段错误,为什么?

4

5 回答 5

2

这是因为 EOF 被定义(在我的编译器中)为 -1 而 char 是无符号字节。所以它总是!=

于 2012-11-09T06:59:34.933 回答
2
 c != '/n' is wrong

 change it to 

  c != '\n'
于 2012-11-09T06:59:44.443 回答
2

c != '/n'应该c != '\n'

\是一个转义字符,在它后跟 的情况下表示n换行符。 /n将被视为两个不同的字符,不能正确地与单个char变量进行比较。

至于你的分段错误,你需要str在你的main函数中分配一些空间:

char* str = malloc(sizeof(char)*MAX_STRING_LENGTH);

或者

char str[MAX_STRING_LENGTH];

但是您还必须确保不要尝试读取字符数超过str数组可以容纳的字符串。

于 2012-11-09T07:00:03.900 回答
2

它出错是因为您从未为其分配空间str并且它指向一个随机位置,这导致 readinput 尝试将数据存储在不存在的位置。

于 2012-11-09T07:07:22.663 回答
1

出现分段错误是因为您将未初始化的指针传递给 function readinput()。您需要执行以下操作:

char str[4096];

int nr = readinput(str);

您应该传入数组的长度,以便被调用的代码可以验证它不会溢出其边界。或者你可以危险地生活并决定 4096 足够大,直到有人试图故意破坏你的程序。


最初的编译器警告是因为多字符常量'/n'的值(类型int)超出了可以存储在 a 中的值范围char,所以当c提升为时int!=与(实现定义的)值的'/n'比较是一定是真的。因此警告:

Warning: comparison is always true due to limited range of data type

所有多字符字符常量都有实现定义的值。没有可移植的多字符字符常量。

ISO/IEC 9899:2011 §6.4.4.4 字符常量

¶10 ...包含多个字符(例如, 'ab')的整数字符常量的值,或包含不映射到单字节执行字符的字符或转义序列的值是实现定义的。...

于 2012-11-09T07:06:30.443 回答