所以我写了一个简单的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;
}
答案 0 :(得分:1)
解析代码不正确:
void get_strings(char **c) {
while (scanf("%[^;]s", c[numStrings]) != EOF) {
getchar();
numStrings += 1;
}
}
scanf()
格式包含与输入不匹配的额外s
。scanf()
的返回值与1
进行比较,以确保转化成功。转换失败仅在文件末尾生成EOF
,否则生成0
,c[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;
}