C - 添加到Char数组和Int

时间:2011-12-28 13:12:30

标签: c arrays

基本上,我有一个数组作为指向函数的指针传递,该函数将第一个字母大写,该数组的strlen也被传递。

在大小写之后,我想要做的是然后在数组的末尾添加“1”,以便hello变为Hello1。但我不确定如何在代码中做这样的事情,或者它是否可能。

...
char myString[70];  <-- Array being passed, where the string is never > 64 char's.
...

void capFirst(char *s, int i) {
    s[0] = (toupper(s[0]));
}

编辑:以下解决方案执行以下操作:

1Security
1Sebastian
1Schumacher
1Sanderson

编辑:

void capFirst(char *s, int i) {
 s[0] = toupper(s[0]);
 s[i] = 1;
 s[i+1] = '\0';
}


int main(int argc, char** argv) {
int i;
int j = 0;
char fileSave[256];
char myString[50];
FILE *fpIn, *fpOut;
for(i = 1; i < argc; i++) {
    fpIn = fopen(argv[i], "rb");
    snprintf(fileSave, 256, "%s~[%d]", argv[i], i);
    fpOut= fopen(fileSave, "wb");
    while((fgets(myString, 49, fpIn)) != NULL) {
        if(isspace(myString[0]))
            break;
        j = strlen(myString);
        if( (j > 8) && (j < 64) ) {
            capFirst(myString, strlen(myString));
            fprintf(fpOut, "%s", myString);
        }
    }

}
return 0;
}

更新:

void capFirstappOne(char *s, int i) {
    s[0] = toupper(s[0]);
    s[i] = '1';
    s[i+1] = '\0';
}


int main(int argc, char** argv) {
int i; int j = 0;
char fileSave[256];
char myString[50];
FILE *fpIn, *fpOut;
for(i = 1; i < argc; i++) {
    fpIn = fopen(argv[i], "rb");
    snprintf(fileSave, 256, "%s~[%d]", argv[i], i);
    fpOut= fopen(fileSave, "wb");
    while((fgets(myString, 64, fpIn)) != NULL) {
        j = strlen(myString);
        if (j > 0 && (myString[j-1] == '\n')) {
            myString[j-1] = '\0';
        }
        if( j > 8) {
            capFirstappOne(myString, strlen(myString));
            fprintf(fpOut, "%s\n", myString);
        }
    }

}
return 0;
}

4 个答案:

答案 0 :(得分:1)

试试这个(如果数组足够大):

s[i] = '1';
s[i + 1] = 0;

答案 1 :(得分:1)

必须 确保数组有足够的空间在最后加1。并且不要错过使用'\0'终止字符串。

void capFirst(char *s, int i) {
    s[0] = toupper(s[0]);
    s[i] = '1';
    s[i+1] = '\0';
}

或使用strcat()功能。

void capFirst(char *s, int i) {
    s[0] = toupper(s[0]);
    strcat(s, "1");
}

完整的计划如下:

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

void capFirst1(char *s, int i)  
{
    s[0] = toupper(s[0]);
    strcat(s, "1");
}

void capFirst2(char *s, int i)  
{
    s[0] = toupper(s[0]);
    s[i] = '1';
    s[i+1] = '\0';
}

int main(void)
{
    char a[10] = {"hello"};
    char b[10] = {"world"};

    capFirst1(a, strlen(a));
    printf("a = %s\n", a); 

    capFirst2(b, strlen(b));
    printf("b = %s\n", b); 

    return 0;
}

答案 2 :(得分:1)

该函数似乎将'1'放在字符串的前面,因为字符串最初以换行符结尾。因此,当向其附加“1”时,结果看起来像“Sebastian \ n1”。当这些字符串打印到输出文件时 - 没有任何分隔符 - 结果看起来像

Sebastian
1Schumacher
1Sanderson
1

当使用fgets读取文件时,检查是否已读取换行符,如果换行符不应该是进一步处理中的字符串的一部分,请将其删除(用'\ 0'覆盖它) 。当使用fprintf写入文件时,它只打印出传递的字符,不会添加任何分隔符,无论是空格还是换行符,因此必须自己添加所需的分隔符。

在您的代码中,

while((fgets(myString, 49, fpIn)) != NULL) {
    if(isspace(myString[0]))
        break;
    j = strlen(myString);
    if( (j > 8) && (j < 64) ) {
        capFirst(myString, strlen(myString));
        fprintf(fpOut, "%s", myString);
    }
}

删除不需要的换行符,您可以在j = strlen(myString);之后插入

    if (j > 0 && myString[j-1] == '\n') {
        myString[--j] = 0;
    }

然后将覆盖换行符(fgets不会读取多个换行符)并且保持长度的变量会相应减少。您无需重新计算strlen,然后可以使用

调用capFirst
    if (j > 8) {
        capFirst(myString,j);
        fprintf(fpOut, "%s\n", myString);
    }

在这种情况下,你不需要检查j < 64,因为你告诉fgets不要读超过48个字符(49-1,一个用于0终结符),所以这是给定的。在上面的代码片段中,我为格式字符串添加了换行符,因此每个字符串都打印在自己的行上。如果您不想这样,可以使用"%s "将空格分隔,“%s”,逗号等。

答案 3 :(得分:0)

以下是如何做到这一点

char myString[70];
.....
void capFirst(char *s, int i) {
    s[0] = (toupper(s[0]));
    s[i] = '1';
    s[i+1] = 0;//NULL Termination
}