如果我向你们展示我的程序应该做什么的一个例子,那会更好。
输入:
3
双人双端 三重双端
四人双人三人间
输出:
4
6
24
因此,第一句Double Double
表示2*2
而Triple Double
表示3*2
,依此类推。
单词End
表示字符串的结尾。
看起来非常简单,但我不知道如何使用字符串并给它们一个值并从那里继续。
到目前为止,我所做的就是:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num_of_orders,i,j;
char orders[25];
char str1[25] = "Double";
char str2[25] = "Triple";
char str3[25] = "Quadruple";
scanf("%d", &num_of_orders);
for (i=0; i<num_of_orders+1; i++){
scanf("%s", orders);
}
return 0;
}
答案 0 :(得分:2)
有许多方法可以解决这个问题,正如各种答案所表明的那样。对于如何处理C中的问题,通常没有一个正确的答案。标准库提供了各种工具,允许您针对任何问题制定许多解决方案。只要代码是正确的并且防止错误,那么选择采用哪种方法主要归结为效率问题。对于少量示例代码,这很少考虑。
要采取的一种方法是识别您不需要数据文件中的第一行(除了读取它/丢弃它以将文件位置指示符移动到数据文件的开头)第一行包含数据。)
这使您可以简单地使用面向行的输入函数(fgets
或getline
)来读取文件中的其余行。 strtok
然后提供了一种将每行拆分为单词的简单方法(记住删除'\n'
或丢弃每行中的最后一个单词)。然后,使用strcmp
比较每个单词并乘以正确的数量是一个小问题。最后,输出乘法的 product 。
这是一个稍微不同的方法来解决问题。程序将从作为第一个参数给出的文件名中读取(或默认情况下来自stdin
):
#include <stdio.h>
#include <string.h>
enum { MAXC = 64 };
int main (int argc, char **argv) {
char buf[MAXC] = ""; /* line buffer */
char *delims = " \n"; /* delimiters */
int idx = 0; /* line index */
FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;
if (!fp) { /* validate file pointer */
fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
return 1;
}
while (fgets (buf, MAXC, fp)) { /* read each line */
if (!idx++) continue; /* discard line 1 */
char *p = buf;
size_t len = strlen (p); /* get length */
int prod = 1;
if (len && buf[len-1] == '\n') /* check for '\n' */
buf[--len] = 0; /* remove newline */
printf (" %s", buf); /* output buf before strtok */
/* tokenize line/separate on delims */
for (p = strtok (p, delims); p; p = strtok (NULL, delims))
{ /* make comparson and multiply product */
if (strcmp (p, "Double") == 0) prod *= 2;
if (strcmp (p, "Triple") == 0) prod *= 3;
if (strcmp (p, "Quadruple") == 0) prod *= 4;
}
printf (" = %d\n", prod); /* output product */
}
if (fp != stdin) fclose (fp); /* close file if not stdin */
return 0;
}
使用/输出强>
$ ./bin/dbltrpl <../dat/dbltrpl.txt
Double Double End = 4
Triple Double End = 6
Quadruple Double Triple End = 24
仔细看看,如果您有疑问,请告诉我。
答案 1 :(得分:1)
在阅读输入时,您可以使用strtok
和&#34; &#34;作为参数来分隔您从输入中读取的单词。这是一个函数,将输入中读取的所有单词填充到字符串数组中:
参数:
char ** words :您将存储输入中读取的所有单词的字符串数组
字符*输入:您阅读的输入(即&#34; Double Double end&#34;)
char * s :您将用于读取输入中的字词的分隔符(即&#34;&#34;,&#34; \ n&#34;)< / p>
void getWords(char **words, char *input, char *s){
*words = strtok(str, s);
while(*words){
words++;
*words = strtok(NULL, s);
}
words++;
*words=NULL; //last element will point to NULL
}
一旦你读取输入中的单词,并且将它们填充到一个字符串数组中,你就可以做这样的事情来计算输出:
int calculate(char **words){
int result = 1;
while(*words){
if (strcmp(*words, "Quadruple") == 0){
result *= 4;
}else if (strcmp(*words, "Triple") == 0){
result *= 3;
}else if (strcmp(*words, "Double") == 0){
result *= 2;
}else if (strcmp(*words, "End") == 0){
return result;
}
words++;
}
}
请注意,在调用这些函数之前,您需要正确初始化您传递的参数。否则,可能会导致分段错误。
答案 2 :(得分:0)
您必须使用string.h
库中的方法,例如:strcmp
(比较两个字符串),strcpy
(将一个字符串复制到另一个字符串)等。通常在处理 c 中的字符串操作时使用。
因为我们在编译时不知道results
数组的大小,所以我们必须动态地为它分配内存。为此,我使用了malloc
和free
。
以下是执行此操作的代码:
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main()
{
int num_of_orders, i, j;
char orders[25];
char str1[25];
strcpy(str1,"Double");
char str2[25];
strcpy(str2,"Triple");
char str3[25];
strcpy(str3,"Quadruple");
scanf("%d", &num_of_orders);
getchar();
int *results = malloc(num_of_orders*sizeof(int));
for (i=0; i < num_of_orders; i++)
{
results[i] = 1;
strcpy(orders,"");
while(strcmp(orders,"End") != 0)
{
scanf("%s", orders);
getchar();
if(strcmp(orders,str1)==0)
results[i] *= 2;
else if(strcmp(orders,str2) == 0)
results[i] *= 3;
else if(strcmp(orders,str3)==0)
results[i] *= 4;
}
}
for(i = 0; i < num_of_orders; i++)
printf("%d\n", results[i]);
free(results);
return 0;
}
注意:此程序使用strcmp
,它会进行区分大小写的比较。如果您需要不区分大小写的比较,请改用strcasecmp
。
答案 3 :(得分:0)
不要忘记整数的乘法可交换这一事实:
#include <stdio.h>
#include <string.h>
int main(void)
{
int num_of_orders, i;
char orders[25];
int result;
char *ptr;
scanf("%d", &num_of_orders);
getchar(); // To comsume '\n'
for (i = 0; i < num_of_orders; i++)
{
fgets(orders, sizeof orders, stdin);
result = 1;
ptr = orders;
while(ptr = strstr(ptr, "Double"))
{
result *= 2;
ptr++;
}
ptr = orders;
while(ptr = strstr(ptr, "Triple"))
{
result *= 3;
ptr++;
}
ptr = orders;
while(ptr = strstr(ptr, "Quadruple"))
{
result *= 4;
ptr++;
}
printf("%d\n", result);
}
return 0;
}
多么简单的方法!
请注意strtok()
具有破坏性,即它会修改order
,如果您想稍后使用它会导致一些问题。另外,我认为使用strtok()
的程序可读性较差。因此,尽可能避免使用它。