【问题标题】:C console application gives smiley face after loopC控制台应用程序在循环后给出笑脸
【发布时间】:2023-03-04 15:13:01
【问题描述】:

当我在case 1 之后(换句话说,在一个while 循环之后)调用case 2 时,下面的代码会产生两个笑脸。但是printSentence(); 的工作原理应该在case 1 中。

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

    char *enterSentence();
    void printSentence(char *);
    char *sentence;
    int willContinue = 1;

main() {
    while (willContinue) {
    int a;
    scanf("%d", &a);
    switch (a) {
           case 1:
                getchar();
                sentence = enterSentence();
                printSentence(sentence);
                break;
           case 2:
                getchar();
                printSentence(sentence);
                break;
           case 3:
                willContinue = 0; //exit
                break;
                }
    }
}

 char *enterSentence() {
         char temp[999];
         gets(temp);
         return temp;
      }

 void printSentence(char *asd) {
         puts(asd);
      }
 .
 . //more code
 .

我想知道这里有什么问题,感谢您的帮助..

【问题讨论】:

  • sentence 似乎没有在每次循环后被清除。
  • 哦!不要使用gets()。它不能安全使用,并且已从最新的 C 标准 (C11) 中删除。

标签: c


【解决方案1】:

temp 是函数enterSentence本地。函数进入时创建,函数终止时销毁。

当您返回对象的地址 (return temp;) 时,它仍然存在并具有该地址,但之后会立即销毁,并且调用函数会收到指向无效位置的指针。

快速而肮脏的解决方案:使temp成为一个静态对象,从程序开始到结束都可以存在

static char temp[999];

注意:正如我所说,static 是一个快速而肮脏的解决方案。最好避免。


编辑

缓慢而干净的解决方案:将temp对象移动到调用函数并将其指针传递给函数

int main(void) {
    char temp[999];
    /* ... */
    enterSentence(temp, sizeof temp);
    /* ... */
}

size_t enterSentence(char *dst, size_t len) {
    size_t retlen;
    fgets(dst, len, stdin);
    retlen = strlen(dst);
    if (dst[retlen - 1] == '\n') dst[--retlen] = 0;
    return retlen;
}

【讨论】:

    【解决方案2】:

    sentence 中存储的先前值保持不变。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-12
      • 1970-01-01
      • 2014-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多