char数组中的数字打印为随机字符

时间:2017-10-23 20:34:07

标签: c

所以我写了一个简单的C程序,它应该用分号作为输入分隔一串字符。然后程序应该按长度对字符串进行排序并将它们打印到控制台。 例如:abc;12;def;1234

我遇到的问题是,输入的任何数字最终都会被打印为随机符号,我不知道为什么。我正在接受这个功能的输入:

void get_strings(char** c)
{
    while (scanf("%[^;]s", c[numStrings]) != EOF)
    {
            getchar();
            numStrings += 1;
    }
}

由于scanf正在寻找字符串,如果输入了数字,它们是否存储为字符形式'这些数字,或者我应该以某种方式投射?

以下是代码的其余部分:

int numStrings = 0;

void sort_strings(char** c)
{
    for (int i = 0; i < numStrings; i++)
    {
        for (int j = 0; j < numStrings - i; j++)
        {
            if (strlen(c[j]) > strlen(c[j + 1]))
            {
                char temp[1000];
                strcpy(c[j], temp);
                strcpy(c[j + 1], c[j]);
                strcpy(temp, c[j + 1]);
            }
        }
    }
}

void show_strings(char** c)
{
    for (int i = 0; i < numStrings; i++)
    {
        if (printf("%s\n", c[i]) != EOF) break; 
    }
}

int main()
{
    char wordLen[100][1000];
    char* word2[100];

    for (int i = 0; i < 100; i++)
    {
        word2[i] = wordLen[i];
    }

    char** words = word2;

    get_strings(words);
    sort_strings(words);
    show_strings(words);
    return 0;
}

1 个答案:

答案 0 :(得分:1)

解析代码不正确:

void get_strings(char **c) {
    while (scanf("%[^;]s", c[numStrings]) != EOF) {
        getchar();
        numStrings += 1;
    }
}
  • scanf()格式包含与输入不匹配的额外s
  • 应将scanf()的返回值与1进行比较,以确保转化成功。转换失败仅在文件末尾生成EOF,否则生成0c[numStrings]的内容将不确定。
  • 转换在第一个字符;处停止,此字符保留在输入流中,但由getchar()读取,但如果有空字段,则相应的转换将失败并且内容数组将是不确定的。
  • 您不应该使用全局变量来读取字符串数。您应该返回此号码。

排序代码也不正确:

  • 内部循环运行一个索引太远:j + 1对于所有运行必须小于numStrings
  • strcpy的参数以错误的顺序传递。
  • strcpy根本不应该使用,你应该只是交换指针。

show_strings()始终在第一行后停止,因为printf将返回打印的字符数。

您可以通过以下方式修复阅读循环:

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

int get_strings(char **c, int maxStrings) {
    int numStrings = 0;
    while (numStrings < maxStrings) {
        switch (scanf("%999[^;]", c[numStrings])) {
          case 1:
            getchar();
            numStrings += 1;
            break;
          case 0:
            if (getchar() == ';') {
                c[numStrings] = '\0';
                numStrings += 1;
            }
            break;
          case EOF:
            return numStrings;
        }
    }
}

void sort_strings(char **c, int count) {
    for (int i = 0; i < count; i++) {
        for (int j = 0; j < count - i - 1; j++) {
            if (strlen(c[j]) > strlen(c[j + 1])) {
                char *temp = c[j];
                c[j] = c[j + 1];
                c[j + 1] = temp;
            }
        }
    }
}

void show_strings(char **c, int count) {
    for (int i = 0; i < count; i++) {
        printf("%s\n", c[i]);
    }
}

int main(void) {
    char words[1000][100];
    char *wordPtrs[100];
    int numStrings;

    for (int i = 0; i < 100; i++) {
        wordPtrs[i] = words[i];
    }

    numStrings = get_strings(wordPtrs, 100);
    sort_strings(wordPtrs, numStrings);
    show_strings(wordPtrs, numStrings);
    return 0;
}