Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的缩短字符串_C_String_Scanf - Fatal编程技术网

C语言中的缩短字符串

C语言中的缩短字符串,c,string,scanf,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"; pr

我试图缩短要显示的字符串长度(
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;
        }
    }
}

按你的问题进行
用C缩短字符串

你可以自己做

charstr[20];
fgets(str,sizeof(str),stdin);/*scanf不适合读取字符串,请改用fgets(请参阅缓冲区溢出)*/
printf(“%.ns”,str);/*n=要打印的字符数*/
打印出左对齐字符串中的n个字符

如果字符串是
str=“someString”
,并且只需要打印其中的4个字符,则可以执行以下操作

printf(“%10.4s”,str);

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

代码存在输入和输出问题

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:
“%[^\n]s”
中的
's'
肯定是不需要的<代码>'s'不是
“%[^\n]”
格式说明符的一部分

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

Input3:代码不将用户输入限制为15,它只请求用户限制输入。用户是邪恶的-不要相信他们会按要求限制输入。使用
%15[^\n]”将保存字符数限制为15

Input4:最好使用
fgets()
进行用户输入。将用户输入读入合理大小的缓冲区,然后扫描它

输入5:使用
fgets()
对两个
scanf()
进行编码是一个问题<代码>扫描(“%d”和选项1)
通常会在
stdin
中留下一个
'\n'
,而
fgets()
只会使用它

[编辑]输入6:()
&home
应该是
home

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

char home[15+1]="HOME";
...
printf("\nPlease enter HOME team's name(max 15 characters including space)\n:>>");
scanf(" %15[^\n]", home);
...
输入解决方案#2:更稳健:

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
}
...

可以添加更多支票:
1.确保用户输入的行中没有其他数据。

2.检查EOF。

TLDR:
printf(“%.15s\n”,“012345678915”)printf(“%.ns”,str)
str[n]=0
,然后简单地
printf(“%s”,str)
。点做什么?@CoolGuy我已经详细解释过了。不要使用
scanf
从用户那里读取字符串,而是使用
fgets
!如果我使用解决方案1..&我输入>15个字符,第15个字符后的剩余字符将直接消失。。如何解决这个问题?顺便说一句,谢谢你的解释,我的问题真的很简单:)@programmer dreamer 1)推荐第二种解决方案。2) 您的评论指出了问题“输入>15个字符…将直接消失”,但没有说明所需的目标。当问题发生时(用户输入太多数据),应该发生什么?截断?,退出代码?没有输入限制吗?每种方法都需要更多的代码。如前所述,用户输入可能是恶意的。最好将用户输入与扫描分开:获取输入,然后扫描它。如果我使用解决方案2,它将跳到确认部分,并要求用户重新输入团队名称。。(如果超过15个字符)@programmer dreamer我不清楚您的评论:“跳到确认部分,让用户输入团队名称”。这是您认为的代码所做的(最多可读取49个字符)还是您希望代码所做的
printf("%.*s", max_Length, str);