我正在尝试为agrv
中的char设置不同的char值。
例如,执行cmd行:
./programm_name abc
因此argv
的长度为3
,但是s
的长度为1
。
我真的不明白为什么:(
#include <stdio.h>
#include <string.h>
#include <ctype.h>
string shift(string s);
int main (int argc, string argv[])
{
if (argc != 2)
{
printf("Usage: ./programm_name keyword\n");
return 1;
}
for(int i = 0; i < strlen(argv[1]); i++)
{
if(isdigit(argv[1][i]))
{
printf("Usage: ./programm_name keyword\n");
return 1;
}
break;
}
string keyword = shift(argv[1]); // here argv[1] length is 3
return 0;
}
string shift(string s)
{
for(int i = 0, int n = strlen(s); i < n; i++)
{
if(s[i] >= 65 && s[i] <= 90)
{
s[i] = s[i] - 65;
}
else if(s[i] >= 97 && s[i] <= 122)
{
s[i] = s[i] - 97;
}
printf("%i\n", s[i]);
}
return s; // here s length is 1
}
答案 0 :(得分:1)
做的时候
else if(s[i] >= 97 && s[i] <= 122) { s[i] = s[i] - 97; }
,其中 s 为“ abc”,则将“ a”替换为0(然后将“ b”替换为1,将“ c”替换为2),因此第一个字符变为0,字符串的长度变为对于任何以null字符表示字符串结尾的函数,该值为0。
您为什么要进行s[i] = s[i] - 97;
或类似的操作?你的目标是什么?
return s; //这里的长度是1
否,当输入为“ abc”或“ ABC”时为0
请勿将(ascii)代码用作文字整数,而应使用'a'等
string shift(string s)
{
for(int i = 0, int n = strlen(s); i < n; i++)
{
if(s[i] >= 'A' && s[i] <= 'Z')
{
s[i] = s[i] - 'A';
}
else if(s[i] >= 'a' && s[i] <= 'z')
{
s[i] = s[i] - 'a';
}
printf("%i\n", s[i]);
}
return s;
}
要知道字符是否为字母,我也建议您使用 isalpha
请注意,您可以执行for(int i = 0, int n = strlen(s); i < n; i++)
而不是for(int i = 0; s[i] != 0; i++)
,而最好使用size_t
键入 i 而不是 int ,因为这是索引的类型(这是 strlen 等返回的类型)