C - 更改 strtok 以合并 strcmp 后无输出打印
C - No output printing after changing strtok to incorporate strcmp
我的意图是创建一个循环来比较标记 phrases
。如果该短语是唯一的(与其他短语不同),则打印它;如果该短语不是唯一的,则 tally
增加 1,并且不打印重复短语。所以每个短语只打印一次,稍后我将添加代码来显示每个短语被计算了多少次。
程序编译无误,运行无输出,程序结束退出。函数 filter_spaces
和 upper_case
工作正常,在我将 for (token = strtok(string, strip); token; token = strtok(NULL, strip))
更改为 for
循环之前它确实打印了短语。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void filter_spaces(char* string);
void upper_case(char string[]);
int main(){
char c, string[201];
int i = 0, k=0, j=0;
char strip[] = ",.:;?!";
char* phrases[1000];
int tally = 0;
printf("What gibberish shall I parse?\n");
while((c = getchar()) != EOF) //while loop for getting characters from stdin
string[i++] = c;
string[i] = '[=10=]'; //insert NULL at end of string
filter_spaces(string);
upper_case(string);
char *phrase = strtok(string, strip);
puts("\nThe phrases entered are: ");
/*for (token = strtok(string, strip); token; token = strtok(NULL, strip))
{
puts(token);
}
*/
while(phrase != '[=10=]')
{
phrases[i++] = strdup(phrase);
phrase = strtok(NULL, strip);
for(k=0; k<i-1; k++)
{
for(j = k+1; j<k; j++)
{
if(strcmp(phrases[k], phrases[j])==0)
{
tally = tally++; //add to phrases[k] count
}
else
{
printf("<%s>\n", phrase); //print and continue on
}
}
}
}
return 0;
}
void upper_case(char string[])
{
int c = 0;
while (string[c] != '[=10=]')
{
if (string[c] >= 'a' && string[c] <= 'z')
{
string[c] = string[c] - 32;
}
c++;
}
}
void filter_spaces(char* string)
{
int i,x;
for(i=x=1; string[i]; ++i)
if(string[i]!=' ' || string[i+1]!=' ')
string[x++] = string[i];
string[x] = '[=10=]';
}
您的程序无法运行,因为您没有正确关闭 while 循环。
试试这个:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void filter_spaces(char* string);
void upper_case(char string[]);
int main()
{
char c, string[201];
int i = 0, k = 0, j = 0;
char strip[] = ",.:;?!";
char* phrases[1000];
int tally = 0;
printf("What gibberish shall I parse?\n");
while((c = getchar()) != EOF) //while loop for getting characters from stdin
string[i++] = c;
string[i] = '[=10=]'; //insert NULL at end of string
filter_spaces(string);
upper_case(string);
char *phrase = strtok(string, strip);
puts("\nThe phrases entered are: ");
/*
for (token = strtok(string, strip); token; token = strtok(NULL, strip))
{
puts(token);
}
*/
while(phrase != '[=10=]')
{
phrases[i++] = strdup(phrase);
phrase = strtok(NULL, strip);
}
for(k=0; k<i-1; k++)
{
for(j = k+1; j<k; j++)
{
if(strcmp(phrases[k], phrases[j])==0)
{
tally = tally++; //add to phrases[k] count
}
else
{
printf("<%s>\n", phrase); //print and continue on
}
}
}
return 0;
}
void upper_case(char string[])
{
int c = 0;
while (string[c] != '[=10=]')
{
if (string[c] >= 'a' && string[c] <= 'z')
{
string[c] = string[c] - 32;
}
c++;
}
}
void filter_spaces(char* string)
{
int i,x;
for(i=x=1; string[i]; ++i)
if(string[i]!=' ' || string[i+1]!=' ')
string[x++] = string[i];
string[x] = '[=10=]';
}
希望对您有所帮助。您计算重复字符和打印唯一字符的逻辑是错误的。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void filter_spaces(char* string);
void upper_case(char string[]);
int main()
{
char c, string[201];
int i = 0, k = 0, j = 0;
char strip[] = " ,.:;?!";
char* phrases[1000];
int tally = 0;
printf("What gibberish shall I parse?\n");
while((c = getchar()) != '\n') //while loop for getting characters from stdin
string[i++] = c;
string[i] = '[=10=]'; //insert NULL at end of string
filter_spaces(string);
upper_case(string);
char *phrase = strtok(string, strip);
puts("\nThe phrases entered are: ");
/*
for (token = strtok(string, strip); token; token = strtok(NULL, strip))
{
puts(token);
}
*/
i=0;
while(phrase != '[=10=]')
{
phrases[i] = strdup(phrase);
int flag=0;
for(k=0; k<i; k++)
{
if(strcmp(phrases[k], phrase)==0)
{
tally = tally++; //add to phrases[k] count
flag=1;
break;
}
}
if(flag==0)
{
printf("**** %s \n", phrase); //print and continue on
}
phrase = strtok(NULL, strip);
++i;
}
printf("Total Number of repeated Words = %d\n",tally);
return 0;
}
void upper_case(char string[])
{
int c = 0;
while (string[c] != '[=10=]')
{
if (string[c] >= 'a' && string[c] <= 'z')
{
string[c] = string[c] - 32;
}
c++;
}
}
void filter_spaces(char* string)
{
int i,x;
for(i=x=1; string[i]; ++i)
if(string[i]!=' ' || string[i+1]!=' ')
string[x++] = string[i];
string[x] = '[=10=]';
}
我的意图是创建一个循环来比较标记 phrases
。如果该短语是唯一的(与其他短语不同),则打印它;如果该短语不是唯一的,则 tally
增加 1,并且不打印重复短语。所以每个短语只打印一次,稍后我将添加代码来显示每个短语被计算了多少次。
程序编译无误,运行无输出,程序结束退出。函数 filter_spaces
和 upper_case
工作正常,在我将 for (token = strtok(string, strip); token; token = strtok(NULL, strip))
更改为 for
循环之前它确实打印了短语。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void filter_spaces(char* string);
void upper_case(char string[]);
int main(){
char c, string[201];
int i = 0, k=0, j=0;
char strip[] = ",.:;?!";
char* phrases[1000];
int tally = 0;
printf("What gibberish shall I parse?\n");
while((c = getchar()) != EOF) //while loop for getting characters from stdin
string[i++] = c;
string[i] = '[=10=]'; //insert NULL at end of string
filter_spaces(string);
upper_case(string);
char *phrase = strtok(string, strip);
puts("\nThe phrases entered are: ");
/*for (token = strtok(string, strip); token; token = strtok(NULL, strip))
{
puts(token);
}
*/
while(phrase != '[=10=]')
{
phrases[i++] = strdup(phrase);
phrase = strtok(NULL, strip);
for(k=0; k<i-1; k++)
{
for(j = k+1; j<k; j++)
{
if(strcmp(phrases[k], phrases[j])==0)
{
tally = tally++; //add to phrases[k] count
}
else
{
printf("<%s>\n", phrase); //print and continue on
}
}
}
}
return 0;
}
void upper_case(char string[])
{
int c = 0;
while (string[c] != '[=10=]')
{
if (string[c] >= 'a' && string[c] <= 'z')
{
string[c] = string[c] - 32;
}
c++;
}
}
void filter_spaces(char* string)
{
int i,x;
for(i=x=1; string[i]; ++i)
if(string[i]!=' ' || string[i+1]!=' ')
string[x++] = string[i];
string[x] = '[=10=]';
}
您的程序无法运行,因为您没有正确关闭 while 循环。 试试这个:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void filter_spaces(char* string);
void upper_case(char string[]);
int main()
{
char c, string[201];
int i = 0, k = 0, j = 0;
char strip[] = ",.:;?!";
char* phrases[1000];
int tally = 0;
printf("What gibberish shall I parse?\n");
while((c = getchar()) != EOF) //while loop for getting characters from stdin
string[i++] = c;
string[i] = '[=10=]'; //insert NULL at end of string
filter_spaces(string);
upper_case(string);
char *phrase = strtok(string, strip);
puts("\nThe phrases entered are: ");
/*
for (token = strtok(string, strip); token; token = strtok(NULL, strip))
{
puts(token);
}
*/
while(phrase != '[=10=]')
{
phrases[i++] = strdup(phrase);
phrase = strtok(NULL, strip);
}
for(k=0; k<i-1; k++)
{
for(j = k+1; j<k; j++)
{
if(strcmp(phrases[k], phrases[j])==0)
{
tally = tally++; //add to phrases[k] count
}
else
{
printf("<%s>\n", phrase); //print and continue on
}
}
}
return 0;
}
void upper_case(char string[])
{
int c = 0;
while (string[c] != '[=10=]')
{
if (string[c] >= 'a' && string[c] <= 'z')
{
string[c] = string[c] - 32;
}
c++;
}
}
void filter_spaces(char* string)
{
int i,x;
for(i=x=1; string[i]; ++i)
if(string[i]!=' ' || string[i+1]!=' ')
string[x++] = string[i];
string[x] = '[=10=]';
}
希望对您有所帮助。您计算重复字符和打印唯一字符的逻辑是错误的。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void filter_spaces(char* string);
void upper_case(char string[]);
int main()
{
char c, string[201];
int i = 0, k = 0, j = 0;
char strip[] = " ,.:;?!";
char* phrases[1000];
int tally = 0;
printf("What gibberish shall I parse?\n");
while((c = getchar()) != '\n') //while loop for getting characters from stdin
string[i++] = c;
string[i] = '[=10=]'; //insert NULL at end of string
filter_spaces(string);
upper_case(string);
char *phrase = strtok(string, strip);
puts("\nThe phrases entered are: ");
/*
for (token = strtok(string, strip); token; token = strtok(NULL, strip))
{
puts(token);
}
*/
i=0;
while(phrase != '[=10=]')
{
phrases[i] = strdup(phrase);
int flag=0;
for(k=0; k<i; k++)
{
if(strcmp(phrases[k], phrase)==0)
{
tally = tally++; //add to phrases[k] count
flag=1;
break;
}
}
if(flag==0)
{
printf("**** %s \n", phrase); //print and continue on
}
phrase = strtok(NULL, strip);
++i;
}
printf("Total Number of repeated Words = %d\n",tally);
return 0;
}
void upper_case(char string[])
{
int c = 0;
while (string[c] != '[=10=]')
{
if (string[c] >= 'a' && string[c] <= 'z')
{
string[c] = string[c] - 32;
}
c++;
}
}
void filter_spaces(char* string)
{
int i,x;
for(i=x=1; string[i]; ++i)
if(string[i]!=' ' || string[i+1]!=' ')
string[x++] = string[i];
string[x] = '[=10=]';
}