缩短C中的字符串

时间:2015-02-08 09:22:14

标签: c string scanf

我正在尝试缩短要显示的字符串长度(printf)。例如,我要求用户输入一个名称,然后程序将只显示它的15个字符。

这是我的代码片段:

int score1=0,score2=0,foul1=0,foul2=0,rebound1=0,rebound2=0,assist1=0,assist2=0,missed1=0,missed2=0,choice1,choice2,choice4,choice5=0;
char choice3,home[15]="HOME",away[15]="AWAY";

printf("\t\t\t==================================\n\t\t\t||     NETBALL SCOREKEEPER\t||\n\t\t\t==================================\n\n");

do
{
    printf("Do you want to enter teams' names?\n1-Yes\n2-No\n:>>");
    scanf("%d",&choice1);
    switch(choice1)
        {
        case 1:
            {
                do
                {
                printf("\nPlease enter HOME team's name(max 15 characters including space)\n:>>");
                scanf(" %[^\n]s",&home);
                printf("\nPlease enter AWAY team's name(max 15 characters including space)\n:>>");
                scanf(" %[^\n]s",&away);
                do
                {
                printf("\n\n%s VS %s\n\n1.Confirm\n2.Edit\n:>>",home,away);
                scanf("%d",&choice2);
                if(choice2!=1&&choice2!=2)
                    printf("\n***ERROR. INVALID INPUT***\n\n");
                }
                while (choice2!=1&&choice2!=2);
                }
                while(choice2==2);
                break;
            }
    case 2:
                {
                printf("\nSet up to default:\n%s VS %s\n\n",home,away);
                break;
                }
    default:
        {
        printf("\n***ERROR. INVALID SELECTION***\n\n");
        break;
        }
    }
}

2 个答案:

答案 0 :(得分:2)

代码有输入和输出问题;

char home[15]="HOME";
...
printf("Do you want to enter teams' names?\n1-Yes\n2-No\n:>>");
scanf("%d",&choice1);
...
printf("\nPlease enter HOME team's name(max 15 characters including space)\n:>>");
scanf(" %[^\n]s",&home);
...

输入1:当然不需要's'中的" %[^\n]s"'s'不是"%[^\n]"格式说明符的一部分。

输入2:如果“最多15个字符”,则home[15]太小,无法保存15 char加上终止空字符'\0'。应该是home[15+1]

输入3:代码不限制用户输入为15,它只要求用户限制输入。用户是邪恶的 - 不要相信他们按要求限制输入。使用"%15[^\n]");将保存char的数量限制为15。

输入4:使用fgets()进行用户输入要好得多。将用户输入读入合理大小的缓冲区并然后扫描它。

输入5:将scanf()fgets()编码是一个问题。 scanf("%d",&choice1);通常在'\n'中留下stdinfgets()只会消费&home

[修改]输入6:(@Cool Guyhome应为char home[15+1]="HOME"; ... printf("\nPlease enter HOME team's name(max 15 characters including space)\n:>>"); scanf(" %15[^\n]", home); ...

输入解决方案#1:快速但不健壮:

char home[15+1]="HOME";
char buf[50];
...
printf("Do you want to enter teams' names?\n1-Yes\n2-No\n:>>");
fgets(buf, sizeof buf, stdin);
if (sscanf(buf, "%d",&choice1) != 1 || choice2 < 1 || choice2 > 2) {
  printf("\n***ERROR. INVALID INPUT***\n\n");
  break;
}
...
printf("\nPlease enter HOME team's name(max 15 characters including space)\n:>>");
fgets(buf, sizeof buf, stdin);
if (sscanf(buf, " %15[^\n]", home) != 1) {
  Handle_BadNameInput();  // all spaces
}
...

输入解决方案#2:更强大:

char

输出:
要打印最大数量为"%.*s"的字符串,请使用printf("%.*s", max_Length, str);

{{1}}

可以添加更多检查:
1.确保用户输入在线路上没有附加数据 2.检查EOF。

答案 1 :(得分:1)

继续提问Shortening strings in C

你可以通过

来完成
char str[20];
fgets(str, sizeof(str), stdin); /* scanf is nasty for reading strings, use fgets instead (see buffer overflow) */
printf("%.ns",str); /* n = number of characters to be printed out */

在左对齐的字符串中打印出n个字符。

如果字符串为str = "someString"并且您需要打印出4个字符,则可以

printf("%10.4s",str);

其中10指定字段长度,4指定要打印的字符数。