字符串开头出现奇怪的字符

时间:2017-04-01 14:26:26

标签: c string character

我从文件中获取不同的晶体管数据。程序将其存储在结构中。然后它会提示用户输入。用户输入5个不同的值,例如12 0.03 100 320 65,然后程序获取这些值并将其与文件中的数据进行比较,并查看是否有任何晶体管适合您输入的参数。 程序然后再次提示用户,并且这一直重复,直到输入字母q,结束程序。

我遇到的问题 - 我在互联网上拖网几个小时试图找到一个解决方案,但没有一个工作 - 是第一套之后的任何输入都不被接受。所以它看起来像这样。

请输入:电压电流功率频率增益
15 0.1 200 100 80
15 0.1 200 100 80
所有相关的晶体管
请输入:电压电流功率频率增益
20 0.3 100 150 40
?1 2 3 4 5

问号始终是一个奇怪的角色。在过去的几个小时里它一直是?在一颗钻石中,字母P和一个带有0010的小方块。我在互联网上发现的一切都说这应该有效。我错过了什么?

这是我的输入功能

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#define MAX 15
struct input{
    int volt, power, freq, gain;
    float amp;
};
struct input inputs[MAX_IN];

int CHK =1, number=0;

int input_function1()
{
    const char check[3] = {'\0'};
    int i;
    const char inp[30] = {'\0'};



    printf("Please input: Voltage Current Power Frequency Gain\n");

    fgets(inp, 30, stdin);
    puts(inp); //Prints out the string to see if the input has been correctly accepted                              
    ungetc(inp, stdin);

    sscanf(inp, "%s", &check);
    if(check[0]!='q' && check[1]!='q' && check[2]!='q')
    {

    sscanf(inp, "%d %f %d %d %d", &inputs[number].volt, &inputs[number].amp, 
    &inputs[number].power, &inputs[number].freq, &inputs[number].gain);

    }

}

以下是我调用该函数的方法。 check_function是根据数据库检查输入晶体管的功能。

while(CHK==1)   
{
    input_function1();

    check_function();
    ++number;

}   

2 个答案:

答案 0 :(得分:0)

您正在声明一个const char数组,如下所示:

const char test[30] = {'\0'};

并且实际上创建了一个不可编辑的字符串/数组,应标记字符串结尾的终止0是此数组中唯一的字符。此零也设置在test[0]

答案 1 :(得分:-1)

这是一个小例子,修复了当前片段中的一些内容:

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

#define MAX 15

struct input {
    int volt, power, freq, gain;
    float amp;
};
struct input inputs[MAX];

int fill_input(int index) {
    char check[4];
    char inp[30];

    printf("Please input: Voltage Current Power Frequency Gain\n");

    fgets(inp, 30, stdin);
    puts(inp);
    sscanf(inp, "%s", &check);

    if (strcmp(check, "qqq") == 0) {
        return 0;
    }

    sscanf(inp, "%d %f %d %d %d", &inputs[index].volt, &inputs[index].amp,
           &inputs[index].power, &inputs[index].freq, &inputs[index].gain);

    return 1;
}

int main(int argc, char *argv[]) {
    int index = 0;

    while (1 && index < MAX) {
        if (!fill_input(index)) break;
        index++;
    }

    printf("End");
    getch();
}

上述代码段的目标是帮助您继续前进。

您可以考虑几点注意事项:

  • 尽量避免全局变量
  • 当前提供的版本远非最佳,想想为什么,不要只是复制粘贴其他代码,试着找出一个好的功能是什么。这里最重要的一课应该是如何编写适当的函数
  • 您的代码段中的错误与不正确匹配数据类型的参数有关,例如,查看fgets docs,您可以看到第一个参数是char*,您正在使用{ {1}},数据类型应匹配
  • 尝试重构函数直到好的,并从每次重构中尽可能多地学习
  • 玩得开心! &lt; ---最重要的一个