排序字符串最大和最小

时间:2019-06-19 03:13:52

标签: c

我无法通过该程序将字符串正确地排序为所有用户输入中的最大和最小

im在if语句及其如何记录最小和最大记录方面有疑问

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

int main()
{
int finish = 0, longest=0, smallest=0, count =0;
char word[20], smallest_word[20], largest_word[20];
while (0 == finish)
{
    printf("enter word:");
    fflush(stdin);
    scanf("%s", &word);
    if (count == 0)
    {
        strcpy(smallest_word, word);
        strcpy(largest_word, word);
    }


    if (strcmp(word, smallest_word)<smallest)
    {
        strcpy(smallest_word, word);
        smallest = strcmp(word, smallest_word);
    }
    if (strcmp(word, largest_word) > longest)
    {
        strcpy(largest_word, word);

        longest = strcmp(word, largest_word);

    }


    if (strlen(word) == 4)
    {
        finish++;
    }
    count++;
}
printf("smallest word: %s\n", smallest_word);
printf("largest word: %s\n", largest_word);

getch();
return 0;
}

程序运行只是无法正确记录最大值和最小值

4 个答案:

答案 0 :(得分:1)

您的逻辑和语法都有一些问题。

如果两个字符串相同,则strcmp(src,dst)返回0,否则分别为src> dst和dst> src时一些正数或负数。

scanf()需要变量的地址,而数组名本身给出了数组第1个元素的地址,因此不需要使用'&'。

对于逻辑部分,您应该在增加值之后继续循环,以避免造成额外的混乱和比较。

get.elementbyId();

不需要最长和最小的变量,因为您可以使用零来代替它们。

我为您编辑的完全有效的代码是

  if (count == 0)
{
    strcpy(smallest_word, word);
    strcpy(largest_word, word);
}

Screenshot of output ::

快乐编码:)

答案 1 :(得分:0)

关于:

if (strcmp(word, smallest_word)<smallest)

如果(strcmp(单词,最大单词)>最长)

strcmp()返回0或> 0或<0。它不返回指向任何东西的指针。返回值<0表示第一个参数按字母顺序在第二个参数之前。返回值0表示两个参数相等。返回值> 0表示第一个参数按字母顺序在第二个参数之后。

答案 2 :(得分:0)

您可以使用app.UseStaticFiles库中的 app.UseAuthentication(); app.Map("/dexml", subApp => { subApp.Use(async (context, next) => { await next(); var userName = context?.User?.Identity?.Name; if (userName != null) { var dbContext = context.RequestServices.GetRequiredService<ApplicationDbContext>(); var user = dbContext.Users.FirstOrDefault(u => u.UserName == userName); using (var provider = new PhysicalFileProvider($@"D:\{ user.Code1 }\{ user.Code2 }")) { var filePath = context.Request.Path.Value.TrimStart('/'); var info = provider.GetFileInfo(filePath); using (var stream = info.CreateReadStream()) { var originalStream = context.Response.Body; await stream.CopyToAsync(originalStream); context.Response.Body = stream; } } } }); }); 来查看字符串的大小。

答案 3 :(得分:0)

头文件conio.h及其getch()不是标准C的一部分,您应该避免使用它们。
参见Why is getch not portable?Why must we refrain from using conio.h? Is it obsolete?


您的循环似乎一直进行到用户输入长度恰好为4的单词为止。无需为此使用诸如finish之类的单独变量。只需使用break语句即可。
即,代替

if (strlen(word) == 4)
{
    finish++;
}

if (strlen(word) == 4)
{
    break;
}

,您可以摆脱该finish变量。


scanf()期望指向缓冲区的指针,在该缓冲区中,需要将扫描的输入作为参数存储在格式字符串之后。使用

scanf("%s", &word);

您要提供指向指针的指针,因为word本身就是指针,因为C中的数组名称会分解为指向其第一个元素的指针。因此,word本身指向存储在word[]数组中的第一个字符。

使用

scanf("%19s", &word);

相反。 19是宽度说明符。之所以选择19,是因为word的大小为20,并且我们需要1字符空间来存储表示字符串末尾的\0。这样可以避免缓冲区溢出。

您可能还需要检查scanf()的返回值。它返回成功分配的次数,例如

if( scanf("%19s", &word)!=1 ) {
    //Something went wrong.
}

请参见What happens if I use "&" with string in scanf function?


fflush()上使用stdin会导致C语言出现不确定的行为,因为它只能用于输出流。参见Using fflush(stdin)


strcmp()仅在第一个参数小于第二个参数时返回负数,而在第一个参数大于另一个参数时返回正数。这些数字可以是任何数字。您无需保存strcmp()的返回值。

所以不是

if (strcmp(word, smallest_word)<smallest)
{
    strcpy(smallest_word, word);
    smallest = strcmp(word, smallest_word);
}
if (strcmp(word, largest_word) > longest)
{
    strcpy(largest_word, word);
    longest = strcmp(word, largest_word);
}

if (strcmp(word, smallest_word) < 0)
{
    strcpy(smallest_word, word);
}

if (strcmp(word, largest_word) > 0)
{
    strcpy(largest_word, word);
}

因此,您可以将程序更改为

char word[20], smallest_word[20], largest_word[20];
for(int count=0; ; ++count)
{
    printf("enter word:");
    scanf("%19s", word);
    if (count == 0)
    {
        strcpy(smallest_word, word);
        strcpy(largest_word, word);
    }

    if (strcmp(word, smallest_word) < 0)
    {
        strcpy(smallest_word, word);
    }

    if (strcmp(word, largest_word) > 0)
    {
        strcpy(largest_word, word);
    }

    if (strlen(word) == 4)
    {
        break;
    }
}
printf("smallest word: %s\n", smallest_word);
printf("largest word: %s\n", largest_word);