使用scanf获取一个字符串来创建并在while循环中验证它...继续获取

时间:2011-12-09 03:52:49

标签: c unix scanf c-strings

我正在创建一个char *,它基本上被视为一个字符串。该字符串被假设一遍又一遍地使用。每当我试图用while循环检查并查看它是否正确“退出”......

*我一直在分段错误......我做错了什么 - 非常愚蠢的错误 - 可能吗?

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

int main(int argc, char* argv[])
{

    char* input = (char*)malloc(sizeof(char));
    input = "CONTINUE";

    while(strcmp(input, "quit") != 0)
    {
            printf("%s", "System: ");
            scanf("%s", input);
    }
    return 0;
}

2 个答案:

答案 0 :(得分:1)

我在第一眼看到的两个问题:

char* input = (char*)malloc(sizeof(char)); 
  1. 您正在为指针指定一个只有一个字符的内存。它应该有足够的内存来保存你的字符串而不仅仅是一个字符。

  2. 您应该使用strcpy将字符串复制到分配的缓冲区中。不为指针指定字符串文字。请注意,修改此类字符串文字会导致未定义的行为

    input = "CONTINUE";

  3. 正确的做法是:

    char* input = (char*)malloc(sizeof(MAX_LENGTH)); 
    strcpy(input, "YOURSTRING"); 
    

    MAX_LENGTH足以容纳您的输入字符串。

答案 1 :(得分:1)

您正在尝试更改非法的字面值。 尝试:

char* input = (char*)malloc(sizeof(char)); /* You need more than one char. */
char* input = (char*)malloc(LENGTH); /* Allocate `LENGTH` chars. */

input = "CONTINUE"; /* You can't write (scanf) over a string literal. */
strcpy(input, "CONTINUE"); /* Now it's legal to write over `input`. */

需要注意的其他要点:

  • scanf与裸“%s”一起使用是不安全的。您应该使用类似"%10s"的内容来确保潜在的恶意用户输入的字符数不超过10个

  • 您知道吗<{1}}是不是必需的,因为保证为1