处理C中多个输入的输出

时间:2013-11-26 14:10:15

标签: c string

这不是一件小事,但我想知道处理多个输出的最佳方法,例如:

输入

第一行输入将包含数字T =测试用例数。以下行将包含每个字符串。

输出

对于每个字符串,在一行上打印“UNIQUE” - 如果字符都是唯一的,则打印“NOT UNIQUE”

示例输入

 3
 DELHI
 london
 #include<iostream>

示例输出

 UNIQUE
 NOT UNIQUE
 NOT UNIQUE

那么我怎样才能完成那样的输出呢?到目前为止我的代码是:

 int main(int argc, char *argv[]) 
 {

     int inputs, count=0;
     char str[100];
     char *ptr;

     scanf("%d",&inputs);


     while(inputs-- >0)
     {
         scanf("%s",str);

         for(ptr=str; *ptr!='\0';ptr++)
         {
             if( *ptr== *(ptr+1))
             {
                 count++;
             }
         }
         if(count>0)
         {
             printf("NOT UNIQUE");

         }
         else
         {
             printf("UNIQUE");
         }

     }

 }

但是上面显然会在每次输入后打印输出,但是我想在输入所有输入后才输出,如果用户输入3,那么用户必须给出3个字符串,输出后将给出是否给定的字符串是唯一的或不是。所以我想知道如何实现问题中给出的结果。另外我想知道的是,我使用的是100个字符的数组,它可以容纳最多100个字符的字符串,但如果我想处理没有限制的字符串,我该怎么办?只是声明char * str是不好的,那该怎么办?

2 个答案:

答案 0 :(得分:0)

希望这会有所帮助:

#include <stdio.h>

int main(int argc, char *argv[])
{
    int inputs,count=0;
    char str[20];
    scanf("%d",&inputs);
    char *ptr;
    char *dummy;

    while(inputs-- >0)
    {
        scanf("%s",str);

        for(ptr=str; *ptr!='\0';ptr++)
        {
            for(dummy=ptr+1; *dummy != '\0';dummy++)
            {
                if( *ptr== *dummy)
                {
                    count=1;
                }
            }
            if(count == 1)
                break;
        }
        if(count>0)
        {
            printf("NOT UNIQUE");
        }
        else
        {
            printf("UNIQUE");
        }
    }
}

答案 1 :(得分:0)

如果您想保存以供日后使用,您必须将其存放在某个地方。以下示例在buf中最多存储10行,然后将str指向当前行:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>    /* for strlen */
#include <ctype.h>     /* for isspace */

int main(int argc, char *argv[]) 
{
    int ninput = 0;
    char buf[10][100];      /* storage for 10 strings */
    char *str;              /* pointer to current string */
    int i;

    printf("Enter up to 10 strings, blank to and input:\n");

    for (i = 0; i < 10; i++) {
        int l;

        str = buf[i];

        /* read line and break on end-of-file (^D) */
        if (fgets(str, 100, stdin) == NULL) break;

        /* delete trailing newline & spaces */
        l = strlen(str);
        while (l > 0 && isspace(str[l - 1])) l--;
        str[l] = '\0';

        /* break loop on empty input */
        if (l == 0) break;
        ninput++;
    }

    printf("Your input:\n");
    for (i = 0; i < ninput; i++) {
        str = buf[i];
        printf("[%d] '%s'\n", i + 1, str);
    }

    return 0;
}

请注意输入和输出的两个独立循环。

我也重新调整了你的输入。我不是很喜欢fscanf;我更喜欢使用fgets读取输入行,然后使用strtoksscanf分析行。优于fscanf的优点是你的字符串可能包含空格。缺点是你有一个你通常不想要的换行符,并且必须“扼杀”。

如果你想允许更长的字符串,你应该使用malloc进行动态分配,虽然我不确定从控制台读取用户输入时它是否有用。当你理解堆栈上固定大小分配的基础知识时,解决这个问题。

其他人已经指出了您检查唯一性时的错误。