我正在C中制作一个小程序,我会在其中放入几个数字和点,然后删除所有点(。)。
我在考虑使用whileloop,但我似乎无法理解接下来应该做些什么。到目前为止我得到了这个:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
char s[30];
int k=0;
printf("Enter your account number including dots. \n");
gets(s);
printf("Account number without dots:");
while (s[k]!=0)
{
//?????
}
return 0;
我是在正确的轨道上还是应该以不同的方式开始并且根本不使用while循环?我只能找到一个解决方案,其中有一个特定的字符串不是由用户编写的,而是由程序员编写的......
答案 0 :(得分:1)
放入IF以仅打印不是点的字符。与其他建议的一样,您也应该将获取更改为fgets。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
char s[30];
int k=0;
printf("Enter your account number including dots. \n");
gets(s);
printf("Account number without dots:");
while (s[k]!=0) {
if ( s[k] != '.' ) {
printf("%c", s[k]);
}
k++;
}
printf("\n");
return 0;
}
使用while循环,我还担心如果用户输入完整的30个字符,您将无法达到退出条件。为了避免这个问题,for循环会更好(因为你已经知道了数组的大小)。但是,如果你这样做,你还需要将数组“s”初始化为空白。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
char s[30];
int k=0;
printf("Enter your account number including dots. \n");
gets(s);
printf("Account number without dots:");
for ( k = 0 ; k < 30 ; k++ ) {
if ( s[k] != '.' && s[k] != 0 ) {
printf("%c", s[k]);
}
k++;
}
printf("\n");
return 0;
}
答案 1 :(得分:0)
这是你可以采用的一种方式 - 它与你的开始方式不同,但可以轻松修改。它也可以改进,但我们可以在进一步的评论中对此进行狡辩。 :)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
/* Take account number in as argument to executable */
int dotless_length = 30;
char dotless[dotless_length];
int k = 0;
int i = 0;
while (argv[1][k] != '\0' && i < dotless_length) {
if (argv[1][k] >= 48 && argv[1][k] <= 57) { /* ascii decimal codes for 0-9 */
dotless[i] = argv[1][k];
i++;
}
else if (argv[1][k] != '.') {
printf("invalid input: %c\n", argv[1][k]);
return 1;
}
k++;
}
dotless[i] = '\0'; /* null-terminate it! */
printf("Account number without dots: %s\n", dotless);
return 0;
}
然后使用gcc -Wall -o zdotless filename.c
进行编译并使用
./zdotless 401.863.3000
为例。
备注:这可能看起来更难,因为它比您的原始输入卫生(和清洁度)稍微多一点 - 例如
dotless
的长度(向不硬编码的步骤)和当您调用可执行文件时,argv
是您键入的内容,因此argv[0]
是可执行文件名(./zdotless
),argv[1]
是下一个参数({ {1}}作为字符串),如果有更多参数,依此类推。由于401.863.3000
是您的dotty输入数字的字符串表示形式,argv[1]
是它的第一个字符,等等。
由于我们逐个字符地复制到argv[1][0]
而不是使用字符串操作,因此您必须手动处理空字符。 (同样的空字符是你在最初读取输入字符串时到达的循环。)其他问题?...
答案 2 :(得分:0)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
char s[30];
int k=0;
printf("Enter your account number including dots. \n");
gets(s);
printf("Account number without dots:");
while (s[k]!=0)
{
if(s[k] == '.')
s[k] = s[k + 1];
k++;
}
s[k] = '\0';
return 0;
答案 3 :(得分:0)
#include <stdio.h>
//remove the specified character from str
char *strrmc(char *str, char ch){
char *from, *to;
from = to = str;
while(*from){
if(*from == ch)
++from;
else
*to++ = *from++;
}
*to = '\0';
return str;
}
int main(int argc, char *argv[]){
char s[30] = "192.169.007";
printf("%s\n", strrmc(s, '.'));//192169007
return 0;
}