基本上,我有一个数组作为指向函数的指针传递,该函数将第一个字母大写,该数组的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;
}
答案 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
}