为什么我不能输入字符串?

时间:2015-10-01 08:16:01

标签: c arrays while-loop char scanf

我试图模拟堆栈概念,这是我的代码,从

到处发生错误
  • 第一个scanf
  • 指向char*变量的所有地方
  • 最终堆栈指针(我将其命名为towerIndicator)根本没有变化。
  • 然后每个输入的输入都被搞砸了:如果我键入' + 314'如果在编译时以某种方式阻止了上面的所有问题,那么在堆栈中添加314,最终会增加3144。

gcc没有通知我任何可用的错误消息,所以我根本不知道去哪里。在这里迫切需要帮助。

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

int main() {
    const int towerHeight = 32;
    int tower[towerHeight];
    int towerIndicator = 0;
    /*
    printf("%i개의 정수를 담을 수 있는 스택을 만들었습니다.\n", towerHeight);
    printf("- '+'를 붙여서 정수를 담습니다.\n");
    printf("- '-'를 입력해 정수를 빼냅니다.\n");
    printf("- '?'를 입력해 스택을 확인합니다.\n");
    printf("- '0'를 입력해 작업을 종료합니다.\n");
    printf("명령을 입력해주세요.\n================================\n");
    */
    char* command;
    char* kindOfCommand[1];
    char* actualCommand;
    while(1) {
        printf("> ");
        scanf("%s", command);
        printf("%s", command);
        strncpy(*kindOfCommand, command, 1); kindOfCommand[1] = '\0';puts("#");
        strncpy(actualCommand, command+1, strlen(command)-1);puts("$");

        switch(**kindOfCommand) {
                int i;
            case '+':
                if(towerIndicator<towerHeight) {
                    tower[towerIndicator] = atoi(actualCommand);
                    towerIndicator++;
                    printf("현재 %i개의 값이 있습니다.\n", towerIndicator);
                } else printf("더 이상 넣을 곳이 없습니다.\n");
                break;
            case '-':
                if(towerIndicator>0) {
                    towerIndicator--;
                    printf("%i\n", tower[towerIndicator]);
                    printf("현재 %i개의 값이 있습니다.\n", towerIndicator);
                } else printf("더 이상 빼낼 값이 없습니다.\n");
                break;
            case '?':
            default:
                printf("[");
                for(i=0; i<towerIndicator; i++) {
                    if(i==towerIndicator) printf("[%i]", tower[i]);
                    else printf("%i", tower[i]);
                    if(i!=towerIndicator-1) printf(" ");
                }
                printf("]\n");
                break;
        }

        if(**kindOfCommand=='0') break;
    }

}

2 个答案:

答案 0 :(得分:1)

这里需要进行相当多的修改

松散修复可能需要更多修复

//    char* command;    // <-- initialize this, failure in scanf other wise
      char command[120] ; 

假设您正在寻找单个字符,请不要使代码复杂化

//    char* kindOfCommand[1];  pointer not required
          char kindOfCommand;

因为你正在某处使用strncpy

//    char* actualCommand; // <-- initialize this
    char actualCommand[126];

和kindOfCommand代码更改

//        strncpy(kindOfCommand, command, 1);
          kindOfCommand = *command;// since you are taking single character
          puts("#");

在交换机上更多

switch( kindOfCommand ) {

并打破

if( kindOfCommand == '0' ) break;

也在结束前返回

return 0;

答案 1 :(得分:0)

我应用了kkk的答案中的变化,现在获得输入效果很好。

char command[11];
char kindOfCommand;
char actualCommand[10];
while(1) {
    printf("> ");
    scanf("%s", command);
    kindOfCommand = *command;
    memset(actualCommand,0,sizeof(actualCommand));
    strncpy(actualCommand, command+1, strlen(command)-1);

    switch(kindOfCommand) { ... }
    ...
    if(kindOfCommand=='0') break;
}
return 0;

}

我需要解决输入搞砸了。这是因为当actualCommand收到来自command的新字符串并且它比之前收到的字符串短时,字符串的最后几个字符仍然保留在actualCommand中。因此,每次while循环循环时,我都会设置memset来重置变量。它不是指针,因此sizeof()可以完成工作。否则,我应该使用strlen()告诉memset长度。