2011-12-09 18 views
0

我创建了一个char *,它本质上将被视为一个字符串。该字符串被假设为一遍又一遍地被使用。每次我试图检查while循环,看看它是否正确的“退出”...使用scanf得到一个字符串来创建并验证它反对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; 
} 

回答

1

两个问题我先看看看:

char* input = (char*)malloc(sizeof(char)); 
  1. 要分配指针只是一个字的记忆。它应该有足够的内存来保存你的字符串,而不仅仅是一个字符。

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

    input = "CONTINUE";

    做上述2

正确方法是:

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

哪里MAX_LENGTH足以保存您的输入字符串。

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个字符

  • 你知道,不需要sizeof(char)因为它保证是1

+0

所以如果我做了... char * input =(char *)malloc(LENGTH); //长度大概是80或100 ... 然后我可以继续做while循环,总是会重写字符串? –

+0

是的。只要不指定“CONTINUE”或像我向你展示的那样使用'strcpy'。 – cnicutar

+0

非常好 - 谢谢很多人。就像我说的,非常愚蠢的错误。 –

相关问题