我在C编程中找不到字符串中的大写字母

时间:2019-03-29 13:38:07

标签: c parsing

我在做作业时遇到问题。我需要从文件中读取字符串,并且需要找到以大写字母开头的单词,并且需要将它们写在新的向量中。步骤1已完成,我需要在这些步骤中使用函数,除<stdio.h>

外,我无法使用库

示例:

原始字符串:笔是红色的 新矢量:钢笔,红色

我的代码:

#include <stdio.h>
#define dim 150
void lettura(int vett1[]); // reading function
void capitalLetter(int vett1[], int vett2[], int i);

main()
{    
    char vett1[dim];
    char vett2[dim];
    int i;
    lettura(vett1);
    capitalLetter(vett1, vett2, i);
}

void lettura(int vett1[])
{
    FILE *fp;
    char nomefile[dim];
    printf("--> Inserisci il nome del file: \n\n", &nomefile); // "insert the name of the file"
    gets(nomefile);
    printf("\n--> Il contenuto del file e' il seguente: \n\n"); // "the content of the file is the following"
    fp= fopen("file.txt","r");
    while(!feof(fp)) {
    fgets(vett1, dim, fp);
    printf("%s", vett1);

    }  // I close the while

    fclose(fp);
}  // I close the function


void capitalLetter(int vett1[], int vett2[], int i)
{
    for(i=0; i<dim; i++){
    if((vett1[i]>= 'A') && (vett1[i]<= 'Z'))
    vett1=vett2;
    }

    printf("%s", vett2);
}

1 个答案:

答案 0 :(得分:0)

capitalLetter函数的第一个问题是参数定义不正确。

void capitalLetter(int vett1[], int vett2[], int i);

这是希望您传递两个int数组,但是您要传递两个char数组。您希望编译器针对这种类型的差异抛出一些警告。您希望它看起来像这样:

void capitalLetter(char vett1[], char vett2[], int i);

您的循环可能超出了字符串的结尾,因为您不检查字符串的结尾-您检查整个数组的大小。找到这样的NUL字符时,应该停止循环。

for(i=0; vett1[i]!='\0'; i++)

我不知道您打算如何使用此行:

vett1=vett2;

,但这没有任何意义,因为它将用空字符串替换您正在处理的字符串。如果要让vett2包含大写字母,则要将其更改为

vett2[j++]=vett1[i];

您可能会猜到,这还意味着添加了一个新变量j。它会使用每个大写字母填充数组vett2并使用j,以便它从开头开始并随其填充,因为您不能使用i,因为它将离开差距。

您也没有明显的理由传入变量i。您可以在函数本身中声明本地副本以及j

int i, j = 0;

在循环之外,您需要向vett2添加一个NUL终止符以使其成为实际的字符串。

vett2[j]='\0';

最终结果看起来像这样:

void capitalLetter(char vett1[], char vett2[]) {
    int i, j = 0;
    for(i=0; vett1[i]!='\0'; i++) {
        if((vett1[i]>= 'A') && (vett1[i]<= 'Z')) {
            vett2[j++]=vett1[i];
        }
    }
    vett2[j]='\0';
    printf("%s", vett2);
}